【问题标题】:Why is the base class inherited twice even when one of them is inherited as virtual?为什么即使其中一个是作为虚拟继承的,基类也会被继承两次?
【发布时间】:2017-10-28 13:23:51
【问题描述】:
#include<iostream>
using namespace std;
int main(){
    class c1{
        public:
        int i;
    };
    class c2:virtual public c1{
        public:
            int j;
    };
    class c3:public c1{
        public:
            int k;
    };
    class c4:public c2,public c3{


    };

    c4 inst1;  //Its an error which indicates multiple base classes have beeen inherited
    inst1.i=34;     

}

我的书说

普通基类和虚拟基类之间的唯一区别是 当一个对象多次继承基础时会发生什么。如果 使用虚拟基类,则只有一个基类存在于 物体。否则会找到多个副本。

但是在这个程序中,即使其中一个基类被继承为虚拟,为什么会有两个副本?

【问题讨论】:

  • 它也许应该说“当一个对象虚拟地多次继承基础”。这不是这里发生的事情。
  • @BoPersson 我认为你的评论有帮助
  • 因为它实际上不是两次都继承。

标签: c++ inheritance


【解决方案1】:

在一个基类中虚拟继承不会使其所有同级基类也虚拟继承。必须在您希望在派生类中直接或间接共享的所有基类中将继承标记为虚拟。

由于您没有将virtual 添加到c3,因此C++ 编译器不能将其继承c1 视为虚拟继承。

添加virtual 解决了这个问题:

class c3 : virtual public c1{
public:
    int k;
}

【讨论】:

  • 你能解释一下吗,“虚拟继承不是传递的。它必须是……”还有关于这个,“由于你没有在c3中添加虚拟,C++编译器不能处理它的继承c1 作为虚拟。”
  • @rimiro "transitive" 不是一个正确的词,我在写它时想到了不同的继承链。我编辑了答案以澄清。
  • @StoryTeller 我有一些问题:q1.C4 中是否保证存在两个 c1 对象? q2。 c4 在继承 c2 时是否负责构造 c1。 q3。是 c3 负责构造 c1(因为有两个 c1 对象)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2013-04-23
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多