虚基类和多重继承下构造函数的顺序
来源:互联网 发布:服务端面试常见算法题 编辑:程序博客网 时间:2024/05/23 00:35
1.没有虚基类:
#include <iostream>#include <cstdio>using namespace std;class A{public: A() { cout << "A" << endl; };};class B : public A{public: B() { cout << "B" << endl; };};class C : public A{public: C() { cout << "C" << endl; };};class D : public B, C{public: D() { cout << "D" << endl; };};int main(){ B b; //输出: A B 先构造基类,再构造子类 D d; //输出: A B A C D return 0;}
2.有虚基类:
#include <iostream>#include <cstdio>using namespace std;class A{public: A() { cout << "A" << endl; };};class VB : virtual public A{public: VB() { cout << "VB" << endl; };};class VC : virtual public A{public: VC() { cout << "VC" << endl; };};class VD : public VB, VC{public: VD() { cout << "VD" << endl; };};int main(){ VD vd; //输出: A VB VC VD //虚基类的subobject总是在最深的地方最先被构造 return 0;}3.存在虚基类的多继承:
#include <iostream>using namespace std;class A{public: A(const string& s) { cout << "A " << s << endl; } virtual ~A() {}};class B{public: B(const string& s) { cout << "B " << s << endl; } virtual ~B() {}};class C{public: C(const string& s) { cout << "C " << s << endl; } virtual ~C() {}};class D{public: D(const string& s) { cout << "D " << s << endl; } virtual ~D() {}};class E : public A, virtual public B, virtual public C{public: E(const string& s) : A("from E"), B("from E"), C("from E") { cout << "E " << s << endl; }};class F : virtual public B, virtual public C, public D{public: F(const string& s) : B("from F"), C("from F"), D("from F") { cout << "F " << s << endl; }};class G : public E, public F{public: G(const string& s) : B("from G"), C("from G"), E("from G"), F("from G") { cout << "G " << s << endl; }};int main(){ //虚基类的构造函数最先执行 G g("from main");}
输出:
引用
B from G
C from G
A from E
E from G
D from F
F from G
G from main
总结:虚基类构造函数最先被执行,然后按照从左到右,从上到下的顺序依次执行每一个构造函数。C from G
A from E
E from G
D from F
F from G
G from main
- 虚基类和多重继承下构造函数的顺序
- 多重继承的构造函数和析构函数的执行顺序(包含虚基类)
- 浅议C++对象模型:多重继承下析构函数和构造函数的调用顺序解析
- C++中多重继承构造函数调用的先后顺序
- 多重继承构造函数执行顺序
- 多重继承构造函数执行顺序
- 多重继承构造函数执行顺序
- (1.4.1)虚继承、虚函数继承、多重继承和“含对象成员类的构造顺序”
- 继承下构造函数的执行顺序
- c++多重继承的构造执行顺序
- 派生类构造函数和多重继承的二义性问题
- 多重继承-构造函数与析构函数执行顺序
- 多重继承派生类的构造函数
- 多重继承 - 构造函数的规则
- 多重继承类构造函数的声明
- 多重继承派生类的构造函数
- 多重继承派生类的构造函数
- 0015.scala的多重继承、多重继承构造器执行顺序、基于trait的AOP实现
- 内存问题初涉
- _tmain与main的区别
- tcp/ip和udp之间的区别
- vc 数据库开发(二)
- 基于云的视频会议五大优点
- 虚基类和多重继承下构造函数的顺序
- ubuntu server 11.10 install GUI
- oracle及postgresql递归查询
- 字符设备学习总结
- Python内置函数清单
- 用Openssl建立私有CA并颁发证书
- asp.net中,使用XDocument操作XML
- 基于linux系统下的MYSQL自动备份
- 内核模块开发基础