继承体系下虚函数表的初始化

有时会被问到这样一个问题,构造函数和析构函数里面可以调用虚函数吗?或许我们知道最好不要那样做,但是为什么呢?写个例子测试一下就知道这并没什么问题,程序也许可能按预期正常执行,但是语法上通过的东西,未必真的就make sense。《深度探索C++对象模型》一书中分析了对象的创建过程,当然也包括虚函数表的部分。首先看原文,关于编译器对构造函数的扩充:


    1.记录在member initialization list中的data members初始化操作会被放进constructor的函数本身,并以members的声明顺序为顺序.
    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 指针必须有所调整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值