为什么基类继承两次,即使其中一个继承为虚拟?

问题描述:

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

} 

我的书上说为什么基类继承两次,即使其中一个继承为虚拟?

正常的基类,一虚一之间的唯一区别是 当一个对象继承基础不止一次发生什么。如果使用了 虚拟基类,那么该对象只有一个基类存在于 中。否则,将找到多个副本。

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

+2

它或许应该说是*“当一个对象继承基** **几乎不止一次” *。这不是什么在这里。 –

+0

@BoPersson我认为你的评论有帮助 – rimiro

+0

因为它几乎不是两次继承。 – EJP

在一个基类中继承几乎不会使其所有的兄弟基类同样继承。继承必须在所有基类中标记为虚拟,您希望直接或间接地在派生类中共享这些基类。

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

添加virtual修复了这个问题:

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

您能否解释一下这个问题:“继承实际上不是传递的,它必须是...”,并且也是这样,“既然您没有为c3添加虚拟,C++编译器就不能将它的继承c1视为虚拟。” – rimiro

+0

@rimiro“传递”不是一个正确的词,当我写它时,我想到了一个不同的继承链。我编辑了答案来澄清。 – dasblinkenlight

+0

@StoryTeller我有一些问题:q1.保证c4中存在两个c1对象? Q2。当c4继承c2时,c4负责构造c1。 Q3。 c3是否负责构造c1(因为有两个c1对象)? – rimiro