纯问题讨论,在看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,希望了解的大神解惑,谢谢
在C++的类内部存储结构中,继承链上只有有一个类包含了虚函数,就意味着从这个类开始派生的所有子类都隐式包含了虚函数,而并不关心你在派生类中是否真正用到了虚函数。
还有就是,构造函数的代码是在编译时候自动为每个类都生成自己的一份,而并非你所谓的AB类合并代码。它的初始化是通过继承链不断向上回溯的。所谓的默认缺省构造函数其实就是一个没参数没内容的空构造函数而已。从理论上来说,任何类编译时候,如果发现没定义构造函数,都会自动创建一个默认构造函数。这只是为了使用的方便性并且能把以前C写的代码比较容易的移植过来而已。
这本书里想告诉你的是:如果这类或它的继承链中无虚函数,则这个默认构造函数将不会被自动创建。这是为了大量的struct类的构造体运行时候的效率提高而已。
而且不同的编译器内部实现也是大相径庭的,所以这种事情基本上理解它的思想就够了,如果太认真你就输了。