纯问题讨论,在看inside object,涉及到 nontrivial编译器合成的默认构造函数,第3个nontrivial 默认构造函数的意思是 :假设A类无构造函数,且含虚函数(声明或者继承(继承)),合成nontivial默认构造函数,
问题是,如果是A自己声明,那么必然合成的默认构造需要做一些初始化vptr和vtbl工作,但是如果是从基类B继承过来的这种情况,则又是?
class B{
public:
B(){}
virtual void foo(){};
}
class A:public B{
public:
void foo() overide{};
virtual goo(){}
}
前提:A无任何构造函数,编译器需要合成(nontrivial 或trivial默认构造);父类B有下面2种
1、基类B有自己定义的默认构造函数
2、B 没有构造函数,需要合成
对于1,A继承B,B由于有自己的默认构造函数,A在编译器合成的时候,需要安插B的默认构造函数代码进去,但此时B有自己定义默认构造,需要安插B的一些初始化vptr和vtbl代码在B的构造函数中?
对于2,A继承B,B没有构造函数,需要编译器合成B的构造函数(nontrivial,B含有虚函数,已经和用户显示定义的默认构造无差别),A也没有默认构造,需要合成,需要安插B的默认构造函数代码?
可能是对继承的细节不是很了解,刚刚才开始看inside,希望了解的大神解惑,谢谢