首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 多態性經典範例:虛函數與動態綁定演示

     編輯:關於C++

代碼示例

#include 
using namespace std;

class Animal {
public:
    virtual void enjoy() {          // 虛函數啟用多態
        cout << "動物叫聲...\n";
    }
    virtual ~Animal() {}            // 虛析構函數(關鍵!)
};

class Dog : public Animal {
public:
    void enjoy() override {         // 覆寫
        cout << "汪汪汪...\n";
    }
};

class Lady {
    Animal* pet;
public:
    Lady(Animal* a) : pet(a) {}
    void askEnjoy() { pet->enjoy(); } // 動態綁定:實際調用 Dog::enjoy()
};

int main() {
    Animal* a = new Dog();   // 基類指針指向派生對象
    Lady lady(a);
    lady.askEnjoy();         // 輸出:汪汪汪...
    delete a;                // 正確調用 Dog::~Dog() 再 Animal::~Animal()
    return 0;
}

核心概念

  1. 虛函數:virtual 關鍵字讓編譯器生成虛函數表(vtable),運行時根據對象真實類型查表調用。
  2. 動態綁定:基類指針/引用調用虛函數時,實際執行派生類的覆寫版本。
  3. 虛析構函數:基類析構函數必須聲明為 virtual。否則 delete basePtr 僅調用基類析構,導致派生類資源洩漏(如內存、文件句柄、鎖)。
  4. override (C++11):明確標註覆寫意圖,編譯器檢查簽名匹配,防止拼寫錯誤產生隱藏而非覆寫。

內存模型圖解

Animal 对象布局:  [vptr] -> Animal::vtable -> { &Animal::enjoy, &Animal::~Animal }
Dog 对象布局:     [vptr] -> Dog::vtable     -> { &Dog::enjoy,     &Dog::~Dog }
基類指針 a 指向 Dog 對象,a->enjoy() 通過 vptr 查表調用 Dog::enjoy。

總結

多態是 C++ 面向對象的核心機制。記住三條鐵律:

  1. 基類析構函數 必須 是虛函數。
  2. 覆寫虛函數加 override。
  3. 只在需要運行時多態的成員函數前加 virtual(有微小性能開銷)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved