9 绝不再构造和析构中调用virtual函数 10 operator=

一、为什么不要在构造和析构中调用virtual函数

  • 构造中调用virtual函数,virtual函数不会下降到derived classes。
  • 原因:
    1)base class构造函的执行早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化。而derived class的成员函数几乎必定会调用local成员变量,这会导致未定义行为,因此c++禁止;
    2)derived class对象的base class构造期间,对象的类型是base class,而不是derived class。使用dynamic_cast和typeid也会把对象视为base clas类型。对象在derived class构造函数开始执行前不会成为一个derived class对象。 这样做的原因就是derived class的专属成分尚未被初始化,将对象的类型视为base class 是安全的。
  • 析构函数:一旦derived class 的析构函数开始执行,其内的成员变量便呈现未定义值。所以c++将其视为不存在,进入base class 析构函数后,对象就成为了一个base class对象。而c++的任何部分包括virtual函数、dynamic-cast也这么看待它。
    **总结:**进入base class构造函数和析构函数,对象都将视为base class 对象。

二、如何避免在构造函数中调用virtual函数

将base class 中构造函数中要调用的函数声明为non-virtual。通过传参的方式将信息从derived class,derived class 传惨时可使用static 函数,以防止使用derivrd class中未初始化的成员变量。


10 令operator= 返回一个reference to *this

为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参。这个协议也适用于所有赋值相关运算,如operator+=。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值