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

C++ 多態基礎:基類指針指向派生類對象的虛函數調用演示

     編輯:關於C語言

前言

C++ 多態的核心在於「基類指針/引用指向派生類對象,調用虛函數時發生動態綁定」。本文通過一個 `Student` → `Graduate` 繼承體系,展示非虛函數與虛函數的行為差異,幫助初學者建立正確的多態認知。

代碼實現

#include <iostream>
#include <string>
using namespace std;

// 基類
class Student {
private:
    int num;
    int age;
    float score;
public:
    Student(int n, int a, float sc) : num(n), age(a), score(sc) {}
    // 非虛函數
    void display() {
        cout << num << endl;
        cout << age << endl;
        cout << score << endl;
    }
};

// 派生類
class Graduate : public Student {
private:
    float pay;
public:
    Graduate(int n, int a, float sc, float p) : Student(n, a, sc), pay(p) {}
    // 同名函數,未加 virtual
    void display() {
        Student::display();  // 顯式調用基類版本
        cout << pay << endl;
    }
};

int main() {
    Student st(12222, 22, 97.4f);
    Graduate gr(353543, 26, 88.2f, 8000.0f);

    Student *pt = &st;
    pt->display();   // 輸出 Student 版本

    pt = &gr;
    pt->display();   // 注意:這裡仍輸出 Student 版本!
    return 0;
}

輸出結果

12222
22
97.4

353543
26
88.2

關鍵分析

修正為多態版本

class Student {
public:
    virtual void display() { ... }  // 加上 virtual
    virtual ~Student() {}           // 基類析構函數應為虛函數
};

class Graduate : public Student {
public:
    void display() override { ... } // C++11 override 關鍵字
};

加上 `virtual` 後,第二次 `pt->display()` 將輸出:

353543
26
88.2
8000

最佳實踐提醒

  1. **基類析構函數必須聲明為 `virtual`**,否則 `delete base_ptr` 導致派生類資源洩漏。
  2. 使用 `override` (C++11) 明確標記覆寫意圖,編譯器會檢查簽名是否匹配。
  3. 使用 `final` (C++11) 禁止進一步繼承或覆寫。
  4. 避免在構造/析構函數中調用虛函數(此時虛表指針尚未完全建立/已拆除)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
調用方式綁定時機結果
`pt->display()` (非虛函數)編譯期靜態綁定永遠調用 `Student::display()`,忽略實際對象類型
`pt->display()` (若加 `virtual`)運行期動態綁定根據實際對象類型調用 `Graduate::display()`