可能的重复:
gcc c++ 虚拟继承问题
Hi all,
我想知道编译器在使用虚拟基类的多重继承时如何处理不同的初始化值。考虑一下臭名昭著的“恐惧钻石”继承计划:
Base
/ \
/ \
D1 D2
\ /
\ /
Join
为了避免有两份副本Base
in Join
,我使用虚拟继承D1
and D2
(参见例如here)。现在,让我们说Base
不是抽象的,但有一个成员字段,在其构造函数中初始化:
class Base {
public:
Base(int x_) {x = x_;};
virtual ~Base(){};
public:
int x;
};
class D1 : public virtual Base {
public:
D1() : Base(1) {};
virtual ~D1(){};
};
class D2 : public virtual Base {
public:
D2() : Base(2) {};
virtual ~D2(){};
};
class Join : public D1, public D2 {
public:
Join(){};
~Join(){};
};
int main()
{
Join j;
cout << j.x << endl;
return 0;
}
输出是 1、2 还是取决于编译器?
它不应该结合。虚拟基由最派生的类初始化,该类是Join
. Join
没有显式初始化Base
but Base
没有可访问的默认构造函数。
[它也不会编译,因为类的定义需要以;
但我认为这是一个错字。main
也应该返回int
我假设j.x
是一个拼写错误j->x
.]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)