以不同的方式克服钻石的歧义

时间:2014-11-04 17:04:52

标签: c++ multiple-inheritance diamond-problem

我知道使用虚拟基类解决它的钻石问题和方法。 我尝试以不同的方式解决钻石问题,但没有成功。我不知道为什么。

#include <iostream>

using namespace std;
class A
{
    public:
       void display()
       {
           cout << "successfully printed";
       }
};

class B: public A
{

};

class C: private A // display() of A will become private member of C
{

};

class D: public B, public C // private member display() of C should not be inherited
{

};

int main()
{
    D d;
    d.display();
    return 0;
}

由于私有成员不是继承的,所以D类不会从C继承任何函数,当D类继承B类和C类时,D中只应该有1个display()函数。但是当我尝试访问{{使用D类对象的函数,显示出显示函数不明确的相同问题。

1 个答案:

答案 0 :(得分:4)

&#34;私人成员不是继承的&#34;这是一个错误的前提,这不是Java。

C ++中的成员访问权限是这样设计的,如果你用public:替换任何private:,程序的行为就不会改变。

因此,名称查找,当编译器遇到名称&#34;显示&#34;在d.display()中,首先在d中找到具有该名称的所有成员函数(有两个),然后找到最佳匹配(此处失败),然后检查是否由于成员访问规则而无法访问它。