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

C++ 虛函數使用範圍與覆寫機制詳解

     編輯:關於C++

前言

虛函數是 C++ 實現執行期多型的核心機制。理解其在基類與衍生類之間的覆寫、隱藏、轉換規則,對於正確設計類別階層至關重要。

一、虛函數覆寫基本規則

  • 衍生類別中同名、同參數、同回傳型別的函數會覆寫基類虛函數
  • 覆寫函數自動成為虛函數(無需重複 virtual)
  • 建議加上 override (C++11) 讓編譯器檢查簽章一致性

二、名稱隱藏與虛函數

若衍生類別定義同名但參數不同的函數,會隱藏基類所有同名虛函數,而非覆寫:

class Base {
public:
    virtual void fcn(int) { cout << "Base::fcn(int)" << endl; }
    virtual void fcn()    { cout << "Base::fcn()" << endl; }
};

class Derived : public Base {
public:
    void fcn(double) { cout << "Derived::fcn(double)" << endl; }  // 隱藏基類所有 fcn
};

int main() {
    Derived d;
    d.fcn(3.14);   // 呼叫 Derived::fcn(double)
    // d.fcn(1);    // 編譯錯誤:基類 fcn(int) 被隱藏
    // d.fcn();     // 編譯錯誤:基類 fcn() 被隱藏
}

解決方法:使用 using Base::fcn; 引入基類名稱。

三、基類指標/參考與衍生類別物件轉換

衍生類別物件可隱性轉換為基類指標或參考,透過虛函數表實現動態繫結:

class Base {
public:
    virtual int fcn() { cout << "Base::fcn()" << endl; return 0; }
};

class Derived : public Base {
public:
    int fcn() override { cout << "Derived::fcn()" << endl; return 1; }
};

int main() {
    Derived d;
    Base* pb = &d;      // 向上轉換
    Base& rb = d;
    pb->fcn();  // 輸出:Derived::fcn() - 動態繫結
    rb.fcn();   // 輸出:Derived::fcn()
}

四、完整程式碼範例

/* cppprimer.cpp
 * Created on: 2013.11.13
 * Author: Caroline
 * Compiler: eclipse cdt, gcc 4.7.1
 */
#include <iostream>
using namespace std;

class Base {
public:
    virtual int fcn() {  // 虛函數
        cout << "This base class [int fcn()]. " << endl;
        return 0;
    }
    virtual void fcn(int) { cout << "Base::fcn(int)" << endl; }
};

class Derived : public Base {
public:
    int fcn() override {  // 覆寫
        cout << "Derived::fcn()" << endl;
        return 1;
    }
    // void fcn(double) { ... }  // 若啟用會隱藏基類所有 fcn
};

int main() {
    Base b;
    Derived d;
    Base* pb = &d;
    pb->fcn();        // 動態繫結:Derived::fcn()
    pb->fcn(42);      // 靜態繫結:Base::fcn(int) (Derived 未覆寫)
    return 0;
}

五、共變返回型別

覆寫函數回傳型別可為基類回傳型別的衍生類別(指標/參考):


class Base {
public:
    virtual Base* clone() { return new Base(*this); }
};
class Derived : public Base {
public:
    virtual Derived* clone() override { return new Derived(*this); }  // 共變返回
};

六、總結

  • 虛函數實現基類介面、衍生類別多型實作
  • 覆寫需簽章完全一致;參數不同會導致名稱隱藏
  • 基類指標/參考指向衍生物件時,虛函數呼叫為動態繫結
  • 善用 override、final (C++11) 增強程式碼安全性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved