《EffectiveC++》条款09 析构和构造时不调用虚函数

在多态操作中,我们不能在析构函数和构造函数中调用虚函数,因为在基类构造和析构期间,我们不能调用派生类的函数,也就是说,构造和析构期间的虚函数不在是虚函数。
考虑以下代码:
在这里插入图片描述上述代码我们想要在构造基类的时候调用派生类logTransaction(),但是这并不会实现,实际将会调用基类的函数,这种情况下实际派生类的logTransaction()还未初始化,因为编译器总是会在派生类之前初始基类成员,因此编译器没办法找到基类的函数调用,所以只能调用父类的函数,而父类的函数为纯虚函数,因而编译器将会发生连接错误。

因而,在调用基类的构造期间,对象的类型将会是基类,而非派生类,不仅仅是虚函数会被解析为基类的虚函数,包括dynamic_cast、dypeid等的解析结果也会将其解析为基类。 同样,这也适合析构函数,一旦基类的析构开始,派生类的对象将会表现为未定义行为。

考虑如下代码:
如果间接的在构造函数种调用虚函数,那也是不行的,而这种情况编译器并不会报错,编译器会调用错误版本的虚函数,而这种错误往往让人很难发现。
在这里插入图片描述
解决方案:
我们可以向父类中传递我们想要记录的日志信息,然后将函数定义为非虚函数。
代码如下:
在这里插入图片描述
也就是说,因为我们不能在构造函数期间向下调用虚函数,因此我们采用向上传递信息的方式实现我们想要的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值