为什么基类继承两次,即使其中一个继承为虚拟?
#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;
}
正常的基类,一虚一之间的唯一区别是 当一个对象继承基础不止一次发生什么。如果使用了 虚拟基类,那么该对象只有一个基类存在于 中。否则,将找到多个副本。
但是在这个程序中,即使当一个基类被继承为虚拟的时候,为什么会有两个副本?
在一个基类中继承几乎不会使其所有的兄弟基类同样继承。继承必须在所有基类中标记为虚拟,您希望直接或间接地在派生类中共享这些基类。
由于您没有将virtual
添加到c3
,因此C++编译器无法将其继承为c1
作为虚拟继承。
添加virtual
修复了这个问题:
class c3 : virtual public c1{
public:
int k;
}
您能否解释一下这个问题:“继承实际上不是传递的,它必须是...”,并且也是这样,“既然您没有为c3添加虚拟,C++编译器就不能将它的继承c1视为虚拟。” – rimiro
@rimiro“传递”不是一个正确的词,当我写它时,我想到了一个不同的继承链。我编辑了答案来澄清。 – dasblinkenlight
@StoryTeller我有一些问题:q1.保证c4中存在两个c1对象? Q2。当c4继承c2时,c4负责构造c1。 Q3。 c3是否负责构造c1(因为有两个c1对象)? – rimiro
它或许应该说是*“当一个对象继承基** **几乎不止一次” *。这不是什么在这里。 –
@BoPersson我认为你的评论有帮助 – rimiro
因为它几乎不是两次继承。 – EJP