一、純虛函數
- 純虛函數一種特殊的虛函數,在許多情況下在基類中不對虛函數做出有意義的實作,而是把它定義為純虛函數,它的實作由派生類實作
- 格式:virtual 傳回類型 函數名(參數清單)=0;
注意事項
- 純虛函數不能實作,沒有函數體,其實作由子類去實作各自的功能版本
- 純虛函數可以在任何通路域下
- 包含純虛函數的類還可以包含其他成員/方法
- 純虛函數可以不在派生類中實作,則派生類接着作為抽象類存在
- 析構函數不能為純虛函數,因為擁有純虛函數的類的派生類對象在釋放時,會調用基類的析構函數
二、抽象類
- 包含純虛函數的類稱為抽象類
- 抽象類包含純虛函數,不能定義對象,隻能被繼承
三、接口類
- 接口類也是抽象類的一部分,類中所有成員函數都是公用并且都是虛函數
- 接口類類似于一種接口,其中的方法都讓子類各自去實作
class CAnimal {
public:
virtual void Bark() = 0;
virtual void Sleep() = 0;
};
class CDog :public CAnimal {
public:
virtual void Bark() override {
};
virtual void Sleep() override {
};
};
class CCat :public CAnimal {
public:
virtual void Bark() override {
};
virtual void Sleep() override {
};
};
四、代碼示範
class CNpc
{
public:
virtual void PK() = 0; //純虛函數
};
class CNpc_1 :public CNpc
{
public:
void PK() { cout << "CNpc_1 PK"; }
};
class CNpc_2 :public CNpc
{
public:
void PK() { cout << "CNpc_2 PK"; }
};
int main()
{
CNpc_1 cnp1;
CNpc_2 cnp2;
CNpc* p1 = &cnp1;
p1->PK(); //調用CNpc_1中的函數
CNpc* p2 = &cnp2;
p2->PK(); //調用CNpc_2中的函數
return 0;
}