C++ 构造函数和析构函数与virtual关键字
来源:互联网 发布:debian ubuntu 性能 编辑:程序博客网 时间:2024/05/16 11:53
一、构造函数
1.构造函数任何时候都不可以声明为虚函数,原因如下:1)虚函数的调用军需通过虚函数表vtable来调用,虚函数表是存储在内存空间的,在调用构造函数前,对象还未被实力化,也就没有该对象的内存空间,也无法找到虚函数表;2)虚函数表实在对象构造之后才建立的,所以构造函数不可能是函数。
2.不能在构造函数内调用虚函数,原因如下:假设有个class继承体系,如下代码,在该base class 的构造函数中调用虚函数,
class A{public: A(); virtual void print() const = 0; .......};A::A(){ ....... print();}class B : public A{ public: B(); virtual void print() const; ......};int main(){ B b;}
当构造B的对象时,B的base class 成分肯定会在derived class 构造之前先构造,神奇的是此时A的构造函数调用的print()为A类内版本,因为base class构造期间,virtual函数绝不会下降到derived class阶层,因为base class构造期间,derived class成员变量尚未初始化。
二、析构函数
1.类的设计目的如果不是作为base class使用,或不是为了具备多态性,析构函数就不该声明为虚函数,原因如下:因为有虚函数的类就会有虚函数表存在,故对象体积会变大,同样因为虚表指针的存在,使得C++中类的对象不在和其他语言(如C)内的相同声明有着一样的结构,,因此也就不再可能把它传递至或接受其它语言所写的函数,故不在有移植性(除非你名确补偿vptr)。
带多态性质的base class或类中带有任何virtual函数,就一定要拥有一个virtual析构函数,原因如下:假设derived class对象经由base class指针被删除,而该base class带着一个non-virtual析构函数,实际执行时通常会发生对象的derived成分没有被销毁。
2.不能在析构函数内调用虚函数,原因如下:一旦derived class析构函数开始执行,对象的derived class成员就会呈现未定义值,所以C++ 就会视它仿佛不存在,进入base class析构后,对象就成为一个base class对象,而virtual函数和 dynamic_casts也这么认为,这也就失去了它动态调用的意义了。
- C++ 构造函数和析构函数与virtual关键字
- 构造函数,析构函数与virtual
- 构造函数、析构函数等和virtual函数
- C++构造与析构(16) - virtual构造函数
- C++构造与析构(17) - virtual拷贝构造函数
- virtual与构造/析构函数(内联函数,构造函数,静态成员函数不能为virtual函数)
- 浅谈C++--绝不在构造和析构函数中调用virtual函数
- virtual应用于构造函数和析构函数的用途
- C#virtual详解,virtual和构造函数的问题
- C++之构造函数和析构函数中不要调用virtual函数(9)---《Effective C++》
- 【Effective c++】条款09:绝不再构造和析构过程中调用virtual函数
- Effective C++:条款09:绝不在构造和析构过程中调用virtual函数
- 《Effect C++》学习------条款09:绝不在构造和析构过程中调用virtual函数
- 读书笔记《Effective C++》条款09:绝不在构造和析构过程中调用virtual函数
- 再说构造与析构,virtual析构函数
- c++-构造函数与析构函数
- C++--构造函数与析构函数
- 【c++】构造函数与析构函数
- 驱动开发中ioctl cmd定义分析
- VS Code开发 Express项目基础搭建
- 新人和老人 对于c语言程序的理解
- oracle ora-04098:触发器无效且未通过重新验证
- AI将会成为未来的方向,程序员未必需转型AI
- C++ 构造函数和析构函数与virtual关键字
- 大型网站架构(三)永无止境:网站的伸缩性架构
- 统一的异常处理
- 萨达时代科技哈萨克打扫打扫
- 大型网站架构(四)随需应变:网站的可扩展架构
- JS练习题(1)
- static
- Java中如何避免麻烦的null值判断
- Swift 创建控制器时自带xib加载在iOS8系统崩溃的问题