为什么析构函数通常很虚?
来源:互联网 发布:手机淘宝怎么搜关键词 编辑:程序博客网 时间:2024/05/21 22:41
前面我们已经说过, 构造函数不可以为虚函数。 现在, 我们要说, 析构函数可以为虚函数, 而且通常需要为虚函数。 先看一个简单的程序:
#include <iostream>using namespace std;class A{public:A(){cout << "A constructor" << endl;}};class B : public A{public:B(){cout << "B constructor" << endl;}};int main(){new B; // 如果是B b; 也会先后调用两个构造函数return 0;}结果:
A constructor
B constructor
继续看:
#include <iostream>using namespace std;class A{public:~A(){cout << "A destructor" << endl;}};class B : public A{public:~B(){cout << "B destructor" << endl;}};int main(){new B; return 0; // 程序结束后,不会调用任何析构函数}
继续看:
#include <iostream>using namespace std;class A{public:~A(){cout << "A destructor" << endl;}};class B : public A{public:~B(){cout << "B destructor" << endl;}};int main(){B b; return 0; // 程序结束后,会先后调用B,A的析构函数}
#include <iostream>using namespace std;class A{public:~A(){cout << "A destructor" << endl;}};class B : public A{public:~B(){cout << "B destructor" << endl;}};int main(){B *pb = new B;delete pb; // 程序会先后调用B, A的析构函数return 0; }
关键的问题来了, 我们知道, C++中经常用到多态, 经常用基类指针指向派生类对象, 所以下面程序有bug:
#include <iostream>using namespace std;class A{public:~A(){cout << "A destructor" << endl;}};class B : public A{public:~B(){cout << "B destructor" << endl;}};int main(){A *p = new B;delete p; // bug, 只调用到了基类A的析构函数, 不符合预期return 0; }修改后为:
#include <iostream>using namespace std;class A{public:virtual ~A(){cout << "A destructor" << endl;}};class B : public A{public:~B(){cout << "B destructor" << endl;}};int main(){A *p = new B;delete p; // ok, 会先后调用B,A的析构函数return 0; }
可见, 析构函数通常要虚。如果不把析构函数设置为虚函数, 会不知不觉地引起很多错误, 比如最常见最可让人伤心的内存泄露
0 0
- 为什么析构函数通常很虚?
- C++中的析构函数为什么通常为虚函数
- 为什么析构函数是虚函数
- 析构函数为什么是虚函数
- 析构函数为什么要是虚函数
- 为什么析构函数是虚函数
- 为什么TCP服务端需要调用bind函数而客户端通常不需要呢?
- 函数通常返回多个值
- 为什么析构函数常声明为虚函数
- 基类的析构函数为什么是虚函数?
- 基类的析构函数为什么是虚函数
- C++析构函数为什么要为虚函数
- 为什么析构函数常声明为虚函数
- 为什么析构函数最好是虚函数?
- 为什么析构函数定义为虚函数
- 析构函数为什么要写成虚函数
- C++析构函数为什么要为虚函数
- 为什么基类的析构函数是虚函数
- windb symbols
- SS5 windows移植
- hql查询语句的拼接要注意
- 多线程
- Servlet与CGI的比较
- 为什么析构函数通常很虚?
- 循环-08. 二分法求多项式单根(20)
- [2]迭代一杂感
- 有关网络编程
- Selenium WebDriver使用Junit创建数据驱动测试
- 当编程语言变成萌娘
- 【JS】【客户端】事件处理 —— 一些事件的处理
- 循环-09. 支票面额(15)
- JUnit4 详解