2017-06-02 80 views
0

爲什麼這個程序在父類的繼承foo()函數和子類中完全相同的頭函數foo()之間似乎存在命名衝突時不會出現錯誤?C++:原始成員與繼承成員的優先級?

這是代碼:

class Parent { 
public: 
    Parent() {} 
protected: 
    void foo() { std::cout << "foo-of-Parent" << std::endl;} 
}; 


class Child:public Parent { 
public: 
    Child() {}; 
    void foo() { std::cout << "foo-of-Child" << std::endl; } 
}; 

int main(){ 

Child john; 
john.foo(); 

return 0; 
} 

是繼承的功能與兒童不怎麼樣的優先級中的一員?

+4

你在那裏有*名稱隱藏*。你可能想要檢查一些很好的C++資源[這裏](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。這需要一點努力才能在這裏正確解釋,所以我建議您檢查這些資源 – WhiZTiM

+0

在您的示例中沒有繼承,因爲foo不是虛擬的。因此,調用Child中的foo是因爲john是Child類型的。 – germanfr

+0

因爲函數是在不同的作用域中定義的? –

回答

4

爲什麼沒有這個程序給一個錯誤,如果有似乎是一個命名衝突

沒有錯誤,因爲沒有命名衝突。在C++中,您可以在不同的名稱空間中定義同名的標識符。子類名稱隱藏(這是一個技術術語)父類的名稱。這意味着父類的隱藏名稱將不會被不合格的查找找到。他們仍然可以通過合格的查找找到。一個例子:

void Child::foo() { 
    Parent::foo(); 
} 
+0

因此,如果我沒有把握正確,我們可以說「訪問」Parent類的foo()的權限賦予Child類。我對嗎? –

+1

@ M-J這就是'protected'訪問說明符所做的事情。它只允許自己和孩子訪問。任何一個類之外的代碼只能訪問'Child :: foo',因爲它是公共的,但不是'Parent :: foo',因爲它不是。 – user2079303