日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

条款七 为多态基类声明virtual析构函数

發布時間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 条款七 为多态基类声明virtual析构函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.如果基類中的成員函數是virtual類型的,其繼承類中相應的函數也是virtual類型,并且基類對象的引用指向繼承類對象時,
基類就可以調用繼承類函數,否則調用的是基類函數

class base { public: virtual void fun(){ printf("base fun");} };class derived:public base { public: void fun(){ printf("derived fun");} };derived der; base &b = der; //或者base *b = &der; b.fun(); //或者b->fun(); 輸出的結果是 derived fun;調用的是子類的函數 //注意是在基類引用指向子類對象時才行; base b = der; 這個不行

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析构函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。