1. 程式人生 > >建構函式中是否可以呼叫虛擬函式

建構函式中是否可以呼叫虛擬函式

1. 從語法上講,呼叫完全沒有問題。
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();
}


親測可以,但是此時的虛擬函式和普通函式沒有區別了。