又是一个简单的例子,代码见具体内容

nosweat_nosweet 2008-06-17 05:07:33
#include <iostream.h>

class OBJ1
{
public:
OBJ1()
{
cout <<"OBJ1\n";}
};

class OBJ2
{
public:
OBJ2()
{
cout <<"OBJ2\n";}
};

class Base1
{
public:
Base1()
{
cout <<"Base1\n";}
};

class Base2
{
public:
Base2()
{
cout<<"Base2\n";}
};

class Base3
{
public:
Base3()
{
cout <<"Base3\n";}
};

class Base4
{
public:
Base4()
{
cout <<"Base4\n";}
};

class Derived:public Base1,virtual public Base2,
public Base3,virtual public Base4
{
public:
Derived():Base4(),Base3(),Base2(),
Base1(),obj2(),obj1()
{
cout <<"Derived ok. \n";
}
protected:
OBJ1 obj1;
OBJ2 obj2;
};

void main()
{
Derived aa ;
cout <<"This is ok. \n";
}



输出结果不太理解,请高手帮我解答一下:
Base2
Base4
Base1
Base3
OBJ1
OBJ2
Derived ok.
This is ok.

这个顺序为什么会是这样的呢?
...全文
86 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
nosweat_nosweet 2008-06-17
  • 打赏
  • 举报
回复
感谢各位的帮助!thank you all guys!
zwspider 2008-06-17
  • 打赏
  • 举报
回复
constructor的执行算法通常如下:
1. 在derived class constructor中, "所有virtual base class"及"上一层base class"的constructor被调用。
2. 上述完成后,对象的vptr(s)被初始化, 指向相关的virtual table(s)
3. 如果有member initilization list的话, 将在constructor体内扩展开来。 // 是按照member申明的顺序
4. 执行程序员提供的代码。

// 来源:深入探索C++对象模型
vcgaoshou 2008-06-17
  • 打赏
  • 举报
回复
派生类的构造函数执行次序
1。基类
1。1 虚基类,
1。2 非虚基类
2。内部成员对像
3。派生类自己的构造函数体
tncqsy 2008-06-17
  • 打赏
  • 举报
回复
先构造虚函数表
然后执行非虚基类的构造函数
OBJ1和OBJ2初始化列表的顺序无关,和声明的顺序有关
tncqsy 2008-06-17
  • 打赏
  • 举报
回复
虚继承

65,210

社区成员

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

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