天天看點

C++:48---純虛函數

一、純虛函數

  • 純虛函數一種特殊的虛函數,在許多情況下在基類中不對虛函數做出有意義的實作,而是把它定義為純虛函數,它的實作由派生類實作
  • 格式: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;
}