c++類的隱藏,覆蓋和重載,using關鍵字使用


轉載一篇文章:

http://www.cnblogs.com/ustc11wj/archive/2012/08/11/2637316.html

類的隱藏和重載不一樣

類的隱藏是指

一個類繼承自另外一個類,則父類中與子類名稱相同的函數將被隱藏,不管父類中這個函數重載了幾次,子類中將不再能夠使用它們。

更詳細的解釋是:

http://www.cnblogs.com/renyuan/archive/2013/06/08/3127562.html

1 重載與覆蓋

    成員函數被重載的特征:

(1)相同的范圍(在同一個類中);

(2)函數名字相同;

(3)參數不同;

(4)virtual關鍵字可有可無。 

    覆蓋是指派生類函數覆蓋基類函數,特征是:

(1)不同的范圍(分別位於派生類與基類);

(2)函數名字相同;

(3)參數相同;

(4)基類函數必須有virtual關鍵字。

 

令人迷惑的隱藏規則
本來僅僅區別重載與覆蓋並不算困難,但是C++的隱藏規則使問題復雜性陡然增加。這里“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。

編程實驗:

#include <iostream>
using namespace std;
class A
{
	public:
		void printfSth()
		{
			cout<<"A::printfsth()"<<endl;
		}
		void printfSth(string str)
		{

			cout<<"A::printfsth(string str):"<<str<<endl;
		}
		void printfSth(int i)
		{
			cout<<"A::virtual printfSth(int i):"<<i<<endl;
			
		}


};
class C:public A
{
	public:
		using A::printfSth;
		void printfSth(double i)
		{
			cout<<"C::printfSth(double i):"<<i<<endl;

		
		}



};

int main()
{


	C* c=new C();
	c->printfSth();
	c->printfSth(1);	
	c->printfSth(1.1);
	delete c;

}

  這個時候就能夠有輸出,因為用了using關鍵字

還有另外一個用法

#include <iostream>
using namespace std;
class A
{
	public:
		void printfSth()
		{
			cout<<"A::printfsth()"<<endl;
		}
		void printfSth(string str)
		{

			cout<<"A::printfsth(string str):"<<str<<endl;
		}
		void printfSth(int i)
		{
			cout<<"A::virtual printfSth(int i):"<<i<<endl;
			
		}


};
class C:private A
{
	public:
		using A::printfSth;
};

int main()
{


	C* c=new C();
	c->printfSth();
	c->printfSth(1);	
	c->printfSth(1.1);
	delete c;

}

  這個時候還是能夠用A中方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM