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;
}