条款七 为多态基类声明virtual析构函数
生活随笔
收集整理的這篇文章主要介紹了
条款七 为多态基类声明virtual析构函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.如果基類中的成員函數是virtual類型的,其繼承類中相應的函數也是virtual類型,并且基類對象的引用指向繼承類對象時,
基類就可以調用繼承類函數,否則調用的是基類函數
2.virtual析構函數有什么用? 如
base * get()
{
derived * p = new derived;
return p;
}
這樣base類就可以調用子類函數,最后要釋放new出來的內存
base *ba = get();
delete ba;
因為base類的析構函數不是virtual類型的,所以delete ba這一邊中只能調用基類的析構函數,無法調用子類的析構函數,
這可能導致子類內存無法釋放完畢
所以在基類中的析構函數定義為virtual類型,這樣delete ba時就可以調用子類的析構函數
3.關于虛函數表的詳細介紹,看鏈接?http://blog.csdn.net/haoel/article/details/1948051
?
#include <iostream> using namespace std;class base {public:void fun1(){ cout << "base fun1" << endl;}virtual void fun2(){ cout << "base fun2" << endl;}virtual ~base(){ cout << "base的析構函數 " << endl;} //注意virtual的析構函數的意義 };class derived:public base {public:void fun1(){ cout << "derived fun1" << endl;}virtual void fun2(){ cout << "derived fun2" << endl;}virtual ~derived(){ cout << "derived的析構函數" << endl;} };base* get() {derived *der = new derived;return der; }int _tmain(int argc, _TCHAR* argv[]) {derived d;//base * b = &d;base *b = get();b->fun1();b->fun2();delete b;return 0; }
轉載于:https://www.cnblogs.com/bizhu/archive/2012/07/20/2601695.html
總結
以上是生活随笔為你收集整理的条款七 为多态基类声明virtual析构函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用python移动飞信模块发送短信
- 下一篇: 单个下拉框数据保持问题