关于虚基类的初始化

耍宝王 2010-02-04 10:49:18
今天自己修改一点东西,编译通过,可运行时频频出错,找问题是弄得我头昏脑胀。最后发现问题出在虚基类的初始化上,源代码层次太复杂,简化了一下,内容如下:(编译器为MinGW(gcc 4.4.3))
#include <stdio.h>

class A //没有定义任何构造函数
{
public:
int m_a;
};

class B : virtual public A
{
public:
int m_b;
B():m_b(0){} //默认构造函数
};

class C : virtual public B
{
public:
int m_c;
C():m_c(0){} //默认构造函数
};

int main()
{
B b;
C c;
printf("B = %d\n", b.m_a);//如果在A类中再添加一个成员,比如int m_a1;此处结果为0,Why?
printf("C = %d\n", c.m_a);
return 0;
}

C++ Primer文中写道:在虚派生中,由最低层派生类的构造函数初始化虚基类。如果最低层派生类的构造函数不显式初始化虚基类,就使用虚基类的默认构造函数。

因此:我原先认为的结果两个都为:0,可实际结果却是未定义的(随机数值)

如果上述类继承时不用虚继承,结果到都是:0

同样,我用ICL编译DEBUG版也是未定义的随机数值,而release版结果到都是:0。当然在A类中手动定义一个默认构造函数,ICL和GCC编译结果就正常了(哪怕未初始化m_a)
...全文
271 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
耍宝王 2010-02-04
  • 打赏
  • 举报
回复
谢谢各位,现在脑子终于转过弯来了
DontKissBossAss 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mstlq 的回复:]
B b;
最低层的是B……
B没有对A初始化……
A的默认构造函数也没有对m_a初始化

C c;
最低层的是C……
C没有对A初始化……
A的默认构造函数也没有对m_a初始化

说完,收工
[/Quote]
真是打酱油的。。。现在多少钱一斤
traceless 2010-02-04
  • 打赏
  • 举报
回复
不管怎么继承或不继承,普通的类成变量没初始话,就是没初始化,哪来的0

要不然那些规定不作废了
mstlq 2010-02-04
  • 打赏
  • 举报
回复

B b;
最低层的是B……
B没有对A初始化……
A的默认构造函数也没有对m_a初始化

C c;
最低层的是C……
C没有对A初始化……
A的默认构造函数也没有对m_a初始化

说完,收工
lovesi3344 2010-02-04
  • 打赏
  • 举报
回复
C++ Primer文中写道:在虚派生中,由最低层派生类的构造函数初始化虚基类。如果最低层派生类的构造函数不显式初始化虚基类,就使用虚基类的默认构造函数。
=======================================================


虚基类使得类B和类C的对象只共享 int m_a;的一个副本

而int m_a;你未初始化m_a, 而类A的默认构造函数也没初始化它
因为你没有创建A的对象 ,所以m_a是个随机值

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧