建構函式中是否可以呼叫虛擬函式
阿新 • • 發佈:2018-12-31
1. 從語法上講,呼叫完全沒有問題。
2. 但是從效果上看,往往不能達到需要的目的。
Effective 的解釋是:
派生類物件構造期間進入基類的建構函式時,物件型別變成了基類型別,而不是派生類型別。
同樣,進入基類解構函式時,物件也是基類型別。
2. 但是從效果上看,往往不能達到需要的目的。
Effective 的解釋是:
派生類物件構造期間進入基類的建構函式時,物件型別變成了基類型別,而不是派生類型別。
同樣,進入基類解構函式時,物件也是基類型別。
所以,虛擬函式始終僅僅呼叫基類的虛擬函式(如果是基類呼叫虛擬函式),不能達到多型的效果,所以放在建構函式中是沒有意義的,而且往往不能達到本來想要的效果。
#include<iostream> using namespace std; class Base { public: Base() { Function(); } virtual void Function() { cout << "Base::Fuction" << endl; } }; class A : public Base { public: A() { Function(); } virtual void Function() { cout << "A::Fuction" << endl; } }; int main() { A a; // Base * b=&a; a.Function(); }
親測可以,但是此時的虛擬函式和普通函式沒有區別了。