1. 普通虛函數(Virtual Function)
- 定義:基類中用
virtual
聲明,允許派生類 覆蓋(Override)。 - 特點:
- 基類可提供默認實現。
- 派生類可選擇性覆蓋(若不覆蓋,則調用基類版本)。
- 示例:
class Shape { public:virtual void draw() {cout << "Drawing a shape." << endl;} };
2. 純虛函數(Pure Virtual Function)
-
定義:基類中用
virtual
聲明并以= 0
結尾,強制派生類必須實現。 -
特點:
- 基類成為 抽象類(Abstract Class),無法實例化。
- 用于定義接口規范,強制派生類遵守。
-
示例:
class Shape { public:virtual void draw() = 0; // 純虛函數 };
3. 虛析構函數(Virtual Destructor)
- 定義:基類的析構函數聲明為
virtual
,確保派生類對象通過基類指針刪除時,能正確調用派生類的析構函數。 - 場景:基類指針指向派生類對象時,必須使用虛析構函數以避免資源泄漏。
- 現象:先執行派生類析構函數,再執行基類析構函數
#include <iostream>// 基類
class Base {
public:// 虛析構函數virtual ~Base() {std::cout << "Base class destructor" << std::endl;}
};// 派生類
class Derived : public Base {
public:~Derived() override {std::cout << "Derived class destructor" << std::endl;}
};int main() {// 通過基類指針創建派生類對象Base* basePtr = new Derived();// 刪除基類指針delete basePtr;return 0;
}
4. 關鍵詞 (C++11)
一、override
顯式標記派生類中對基類虛函數的重寫,強制編譯器檢查函數簽名是否完全匹配,避免因拼寫錯誤或參數不匹配導致意外定義新函數
二、final
修飾類:禁止類被繼承(如工具類或不可變類)。
修飾虛函數:禁止派生類進一步重寫該函數(如關鍵算法或接口)。
class Base {
public:virtual void log() final { // 禁止派生類覆蓋cout << "Base log." << endl;}
};
#include <iostream>// 基類
class Base {
public:// 虛函數virtual void print() {std::cout << "This is the Base class." << std::endl;}
};// 派生類
class Derived : public Base {
public:// 重寫基類的虛函數void print()final {std::cout << "This is the Derived class." << std::endl;}
};// 派生類的派生類
/*
class Deriveder : public Derived {
public:// 重寫基類的虛函數void print() override {std::cout << "This is the Deriveder class." << std::endl;}
};
*/// 多態函數
void callPrint(Base* obj) {obj->print();
}int main() {Base base;Derived derived;//Deriveder Deriveder;// 調用多態函數callPrint(&base);callPrint(&derived);//callPrint(&Deriveder);return 0;
}