虛函數可以有預設參數嗎?
問題:
宣告虛函數時基底類別中帶有預設參數,衍生類別是否繼承這些參數預設值?
答案:
不,虛函數中的預設值不會被衍生類別繼承。使用的預設值由呼叫函數時物件的靜態類型決定。
說明:
C 標準(C 03 和C 11)指定虛函數呼叫使用在函數定義中聲明的預設參數,該參數由用於呼叫該函數的指標或引用的靜態型別決定。
範例:
考慮以下程式碼:
struct Base { virtual void f(int a = 7); }; struct Der : public Base { void f(int a); };
透過指向Base 物件的指標呼叫f() 時,預設值7 會被使用:
Base* pb = new Base; pb->f(); // uses the default 7
但是,當透過指標呼叫f() 時Der對象,將不會使用衍生類別的預設值:
Der* pd = new Der; pd->f(); // error: no default argument for this function
實踐和編譯器注意事項:
雖然C 標準規定了行為,但某些編譯器可能會以不同的方式實作虛擬函數預設參數。但是,建議遵循標準的指南,以確保跨編譯器的行為一致。
程式碼示範:
以下程式碼示範了預設參數行為:
struct Base { virtual string Speak(int n = 42); }; struct Der : public Base { string Speak(int n = 84); }; int main() { Base b1; Der d1; Base *pb1 = &b1, *pb2 = &d1; Der *pd1 = &d1; cout << pb1->Speak() << "\n" // Base 42 << pb2->Speak() << "\n" // Der 42 << pd1->Speak() << "\n" // Der 84 << endl; }
輸出:
Base 42 Der 42 Der 84
以上是虛函數中的預設參數會繼承到衍生類別嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!