C++之虚析构函数
//虛析構(gòu)函數(shù)
/*如果一個類有子類,則這個類(父類)的析構(gòu)函數(shù)必須是虛函數(shù)如果父類的析構(gòu)函數(shù)不是虛函數(shù),則當(dāng)(delete)刪除一個指向子類對象的父類指針時,將調(diào)用父類版本的析構(gòu)函數(shù),子類只釋放了來自于父類的那部分成員變量,而子類自己擴(kuò)展的成員變量沒有被釋放,造成內(nèi)存泄漏
*/#include "stdafx.h"
#include<stdlib.h>
#include<iostream>using namespace std;
class Base
{
public:
Base(){}
virtual~Base() {
cout << "Base destructor " << endl;
}};
class Derived :public Base
{
public:
Derived(){}
~Derived()
{
cout << "Derived destructor!" << endl;
}};int main()
{
//Derived d;//在棧區(qū)
Base *p = new Derived();//在堆區(qū)聲明一個子類對象,父類指針指向子類堆空間
delete p;//回收,在父類析函數(shù)不是虛函數(shù)的情況下,只調(diào)用父類析構(gòu)函數(shù),子類只釋放了繼承于父類的成員//將父類的析構(gòu)函數(shù)聲明稱虛函數(shù)之后,析構(gòu)時,由于是在棧上進(jìn)行回收,因此先析構(gòu)子類,再析構(gòu)父類
//子類構(gòu)造時,先調(diào)用父類構(gòu)造函數(shù),再調(diào)用子類構(gòu)造函數(shù)
system("pause");
return 0;
}
總結(jié)
- 上一篇: C++继承关系
- 下一篇: C++之抽象基类与纯虚函数