# 技術|C++ |C++ Virtual 函數 - 虛擬函數 virtual function - 使用 `reference/pointer` 呼叫 base 類別的 `virtual function` 時,會觸發 dynamic binding,這種時候 runtime 才會知道要呼叫哪一個函數 - 底層是使用 virtual table 和 virtual pointer - virtual table 在編譯期就準備好了 - `每一個定義的類別會有一張共用的 virtual table` - `每一個實體化的物件,會有 virtual pointer 指向共用的 virtual table` - 當遇到 dynamic binding 時,根據底層物件的 virtual table,決定要呼叫哪一個函數 -  - 細節 - virtual function 在被繼承的時候,編譯器會幫忙補上 virtual 關鍵字 - 指定 `override` 關鍵字,覆寫父類別的函數實作 - 指定 `final` 關鍵字在,讓之後的衍生類別不能覆寫 - base/dericed 的虛擬函數,interface 必須完全相同 - 參數完全相同 - 回傳值完全相同 ## Dynamic Binding 和 default augument - 函數呼叫 dynamic binding 是根據 virtual table - 預設參數是根據靜態類型(即指針類型) ```c++= #include <iostream> using namespace std; class A { public: virtual void f(int n = 7) { cout << "A" << " " << n << endl; }; }; class B : public A { public: void f(int n = 9) { cout << "B" << " " << n << endl; }; }; int main() { A *pa = new A, *pb = new B; B *pc = new B; pa->f(); // A 7 pb->f(); // B 7 pc->f(); // B 9 } ```
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.