gpt4 book ai didi

c++ - 以不同的方式克服菱形歧义

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:00 25 4
gpt4 key购买 nike

我知道菱形继承(钻石问题)和使用虚拟基类解决它的方法。我试图以不同的方式解决菱形继承(钻石问题)但没有成功。我不知道为什么。

#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;
}

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

最佳答案

“不继承私有(private)成员”是一个错误的前提,这不是 Java。

C++ 中的成员访问的设计方式是,如果您将任何 private: 替换为 public:,程序的行为将不会改变。

因此,名称查找,当编译器在 d.display() 中遇到名称“display”时会发生在这里,首先查找 d 中具有该名称的所有成员函数(有两个),然后找到最匹配的(此处失败),然后才检查它是否由于成员访问规则而恰好无法访问。

关于c++ - 以不同的方式克服菱形歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26740893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com