📜  C ++ |继承|问题12

📅  最后修改于: 2021-06-29 03:18:48             🧑  作者: Mango

#include
using namespace std;
  
class Base
{
protected:
    int a;
public:
    Base() {a = 0;}
};
  
class Derived1:  public Base
{
public:
    int c;
};
  
  
class Derived2:  public Base
{
public:
    int c;
};
  
class DerivedDerived: public Derived1, public Derived2
{
public:
    void show()  {   cout << a;  }
};
  
int main(void)
{
    DerivedDerived d;
    d.show();
    return 0;
}

(A) “ cout << a;”行中的编译器错误
(B) 0
(C)行“类派生派生:公共派生1,公共派生2”中的编译器错误答案: (A)
说明:这是多重继承的钻石问题的典型示例。在这里,基类成员’a’通过Derived1Derived2继承。因此, DerivedDerived中有两个“ a”副本,这使语句“ cout << a;”变得模棱两可。

C++中的解决方案是使用虚拟基类。例如,以下程序可以正常运行并打印

#include
使用命名空间std;

班级基础
{
受保护的:
诠释
上市:
Base(){a = 0;}
};

类Derived1:虚拟公共基础
{
上市:
int c;
};

类Derived2:虚拟公共基础
{
上市:
int c;
};

class DerivedDerived:公共Derived1,公共Derived2
{
上市:
无效的show(){cout << a; }
};

int main(无效)
{
派生d;
d.show();
返回0;
}这个问题的测验

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。