有时会被问到这样一个问题,构造函数和析构函数里面可以调用虚函数吗?或许我们知道最好不要那样做,但是为什么呢?写个例子测试一下就知道这并没什么问题,程序也许可能按预期正常执行,但是语法上通过的东西,未必真的就make sense。《深度探索C++对象模型》一书中分析了对象的创建过程,当然也包括虚函数表的部分。首先看原文,关于编译器对构造函数的扩充:
2.如果有一个member并没有出现在member initialization list中,但它有一个default constructor,那么该default constructor必须被调用.
3.在那之前,如果 class object有 virtual table pointers,它们必须被设定初值,指向适当的 virtual tables.
4.在那之前,所有上一层的base class constructors必须被调用,以base class 的声明顺序为顺序(与member initialization list中的顺序没关联):
如果base class 被列于member initialization list中,那么任何明确指定的参数都应该传递过去.
如果base class 没有被列于member initialization list中,而它有default constructor(或default memberwise copy constructor),那么就调用它.
如果base class 是多重继承下的第二或后继的base class,那么 this 指针必须有所调整