1. 程式人生 > >C++ 函式隱藏

C++ 函式隱藏

只有基類成員函式的定義已宣告virtualkeyword,當在派生類中的時間,以支付功能實現,virtualkeyword可以從時間被新增以增加。它不影響多狀態。

easy混淆視聽,掩蓋:
,規則例如以下: 

1) 假設派生類的函式與基類的函式同名,可是引數不同。

此時,不論有無virtualkeyword,基類的函式將被隱藏(注意別與過載混淆)。 

2) 假設派生類的函式與基類的函式同名。而且引數也同樣,可是基類函式沒有virtualkeyword。

此時,基類的函式被隱藏(注意這樣的情況與函式過載的差別,過載發生在同一個類中。

)。

#include<iostream>
using namespace std;

class Base
{
public: 
	virtual void f(float x)
	{
		cout<<"BASE::f"<<x;
	}
	virtual void g(float x)
	{
		cout<<"BASE::g"<<x;
	}
	void h(float x)
	{
		cout<<"BASE::h"<<x;
	}
};
class Driver:public Base
{
public: 
	void f(float x)
	{
		cout<<"d::f"<<x;
	}
	virtual void g(int x)
	{
		cout<<"d::g"<<x;
	}
	void h(float x)
	{

		cout<<"d::h"<<x;
	}
};

int main(int argc, char const *argv[])
{
	Driver d;
	Base* pb=&d;
	Driver* pd=&d;
	pd->f(1.2f);
	pb->f(1.2f);
	pd->g(1.2f);
	pb->g(1.2f);
	pd->h(1.2f);
	pb->h(1.2f);
	return 0;

}

請大家注意,f()函式屬於覆蓋,而g()與h()屬於隱藏。從上面的執行結果,我們能夠注意到在覆蓋中。用基類指標和派生類指標呼叫函式f()時。系統都是執行的派生類函式f(),而非基類的f()。而在隱藏方式中,用基類指標和派生類指標呼叫函式g()、h()時,系統會進行區分,基類指標呼叫時,系統執行基類的g()、h(),而派生類指標呼叫時,系統“隱藏”了基類的f(),執行派生類f(),這是“藏”起源。