栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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+=。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847198.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号