继承体系下的对象构造顺序
2021-09-14 本文已影响0人
404Not_Found
- 作者: 雪山肥鱼
- 时间:20210821 17:06
- 目的: 继承体系下的对象构造顺序
namespace _nmsp1
{
//构造顺序,并非单纯的 先调用A B C ,而是 A 的构造函数 调用了B 的构造函数,B的构造函数调用了C 的构造函数
class A
{
public:
A()
{
cout << "A:A()" << endl;
}
virtual ~A()
{
}
};
class B:public A
{
public:
B()
{
cout << "B:B()" << endl;
}
virtual ~B()
{
}
};
class C :public B
{
public:
C()
{
cout << "C:C()" << endl;
}
virtual ~C()
{
}
};
void fun()
{
C obj;
}
}
构造顺序,起始应该叫做构造调用顺序。并非单纯的 先构造 A 再B,最后C。应该说C的构造函数,调用构造函数B的构造函数,B的构造函数调用了A的构造函数。
class C :public B
{
//这个 m_c 初始化列表 是在 A B 构造函数结束后,开始赋值的,然后才执行构造函数内部逻辑
public:
C() :m_c(11)
{
cout << "C:C()" << endl;
}
virtual ~C()
{
}
int m_c;
};
另外补充: 初始化列表是在A B 构造函数结束后,才开始赋值,最后执行内逻辑的。
多继承中的虚函数流程
A 的虚函数给C, B 的虚函数也会给C,类C只会维护一张虚表。
构造函数中调虚函数
貌似这样德应用场景很少,但是根据vs2017编译器的情况是,不会走虚函数表,直接走函数地址。