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

C++虛函數與純虛函數:多態機制核心解析

     編輯:C++ 入門

1. 虛函數:實現動態綁定

問題場景

class People { public: void walk() { cout << "People walk"; } };
class Man : public People { public: void walk() { cout << "Man walk"; } };

People* p = new Man();
p->walk(); // 輸出 "People walk" —— 靜態綁定!

C++默認靜態綁定(根據指針類型),與Java不同。

解決方案:virtual關鍵字

class People { 
public: 
    virtual void walk() { cout << "People walk"; } 
};
class Man : public People { 
public: 
    virtual void walk() { cout << "Man walk"; } // 覆寫
};

People* p = new Man();
p->walk(); // 輸出 "Man walk" —— 動態綁定!

機制原理

  • 含virtual函數的類生成**虛函數表(vtable)**
  • 對象包含**vptr**指向類的vtable
  • 派生類覆寫時,在自己的vtable中替換對應槽位
  • 通過基類指針/引用調用虛函數 → 查vptr → 找vtable → 調用實際函數

2. 純虛函數與抽象類

語法

class Shape {
public:
    virtual void draw() = 0; // 純虛函數,無實現
    virtual double area() = 0;
};

規則

  • 含純虛函數的類為**抽象類**,**不能實例化**
  • 派生類**必須實現**所有純虛函數,否則仍為抽象類
  • 構造函數不能是虛函數,**析構函數應聲明為virtual**

示例

class People {
public:
    virtual void walk() = 0; // 純虛函數
};

class Man : public People {
public:
    void walk() override { cout << "Man walk"; } // 必須實現
};

People* p = new Man(); // 合法
// People p2; // 編譯錯誤:抽象類不能實例化
// Man m; m.walk(); // 合法

3. 關鍵區別總結

特性虛函數純虛函數
語法`virtual void f();``virtual void f() = 0;`
實現可有可無基類無實現
類類型具體類抽象類
實例化可不可
派生類要求可選覆寫必須實現
用途提供默認行為,允許覆寫定義接口契約,強制實現

4. 最佳實踐

  • 基類析構函數**始終聲明為virtual**
  • 覆寫時使用`override`關鍵字(C++11)防止簽名錯誤
  • 純虛函數可有定義(罕見,供派生類調用)
  • 避免在構造/析構函數中調用虛函數(行為與預期不同)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved