我知道使用虚拟基类解决它的钻石问题和方法。 我尝试以不同的方式解决钻石问题,但没有成功。我不知道为什么。
#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类对象的函数,显示出显示函数不明确的相同问题。
答案 0 :(得分:4)
&#34;私人成员不是继承的&#34;这是一个错误的前提,这不是Java。
C ++中的成员访问权限是这样设计的,如果你用public:替换任何private:,程序的行为就不会改变。
因此,名称查找,当编译器遇到名称&#34;显示&#34;在d.display()中,首先在d中找到具有该名称的所有成员函数(有两个),然后找到最佳匹配(此处失败),然后检查是否由于成员访问规则而无法访问它。