2017-06-02 45 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