虛析構和純虛函數

1. 虛析構

#include <iostream>

using namespace std;

using namespace std;

class CFather
{
public:
	virtual void fun()
	{
		cout << "fun()" << endl;
	}

	virtual void show()
	{
		cout << "CFather  " << "show()" << endl;
	}

	virtual ~CFather()
	{
		cout << "~CFather" << endl;
	}
};

class CSon : public CFather
{
public:
	virtual void show()
	{
		cout << "CSon " << "show()" << endl;
	}
	virtual ~CSon()
	{
		cout << " ~CSon " << endl;
	}
};

class CXiaoMing
{
public:
	~CXiaoMing()
	{
		cout << "~CXiaoMing " << endl;
	}
};

int main()
{
	CFather *fa = new CSon;

	//delete fa; //這裏先調用CSon的析構,再調用CFather的析構
	delete (CXiaoMing *)fa;// 1.delete 哪個類型,就調用哪個類的析構,這裏把fa強轉成了CXiaoMing *類型,
						   //   所以調用了CXiaoMing的析構,沒有調用CFather 和CSon的析構
						   // 2. 但是釋放的空間仍然是fa指向的空間,不過如果析構函數裏有指針釋放,由於這裏沒有調用fa的析構,fa裏的指針無法得到釋放

	return 0;
}

2. 純虛函數

#include <iostream>

using namespace std;

//抽象類 :有純虛函數的類,就叫抽象類
//接口類 :成員函數全是純虛函數的類,就叫接口類,析構函數也是虛析構
//         最好不要有成員變量,可以有靜態常量(static const 或 enum ),不要聲明構造函數

class CFather
{
public:
	virtual void fun () = 0; //純虛函數 : 沒有函數實現,有純虛函數的類,不能實例化對象
};

class CSon : public CFather
{
public:
	void fun() //父類有純虛函數,子類必須實現這個純虛函數,子類才能實例化對象,父類仍然不能實例化對象
	{
		cout << "fun" << endl;
	}
};

int main()
{
	//CFather fa;//報錯,不能實例化抽象類
	CSon so;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章