1. 程式人生 > >C++中繼承關系中的同名隱藏和對策

C++中繼承關系中的同名隱藏和對策

兩個 blog pub ++ 繼承 return har cout 返回值

  在C++及其面向對象的理論中,有這樣的場景:一個類繼承自另外一個類,如果這兩個類都有一個函數名和參數及其返回值一樣的成員函數,那麽子類的函數會自動將父類對應的函數隱藏。即同名隱藏。在有時的開發過程中,我們卻希望子類的成員函數和父類的成員函數均要執行。那麽就需要在子類的成員函數中,顯式地對父類同名的成員函數進行調用。
  下面的例子即演示了同名隱藏的概念和避免同名隱藏的方法。

#include <iostream>

using namespace std;

class BaseClass
{
public:
	BaseClass()
	{
		cout << "BaseClass::BaseClass()\t" << this << endl;
	}
	~BaseClass()
	{
		cout << "BaseClass::~BaseClass()\t" << this << endl;
	}

	void ShowMsg()
	{
		cout << "BaseClass::ShowMsg()\t" << this << endl;
	}

	void ShowMsg2()
	{
		cout << "BaseClass::ShowMsg2()\t" << this << endl;
	}
};

class SubClassA: public BaseClass
{
public:
	SubClassA()
	{
		cout << "SubClassA::SubClassA()\t" << this << endl;
	}

	~SubClassA()
	{
		cout << "SubClassA::~SubClassA()\t" << this << endl;
	}

	void ShowMsg()
	{
		BaseClass::ShowMsg();
		cout << "SubClassA::ShowMsg()\t" << this << endl;
	}

	void ShowMsg2()
	{
		cout << "SubClassA::ShowMsg2()\t" << this << endl;
	}
};

int main(int argc, char *argv[])
{
	cout << "process begin at\t" << (void*) &main << endl;
	SubClassA subClassA;
	cout << "隱藏基類成員的測試" << endl;
	subClassA.ShowMsg2();
	cout << "=====顯式調用被隱藏的基類成員的測試========" << endl;
	subClassA.ShowMsg();
	cout << "======end test=========" << endl;

	return 0;
}

程序的日誌:
process begin at 0x401a65
BaseClass::BaseClass() 0x62feee
SubClassA::SubClassA() 0x62feee
隱藏基類成員的測試
SubClassA::ShowMsg2() 0x62feee
=====顯式調用被隱藏的基類成員的測試========
BaseClass::ShowMsg() 0x62feee
SubClassA::ShowMsg() 0x62feee
======end test=========
SubClassA::~SubClassA() 0x62feee
BaseClass::~BaseClass() 0x62feee

C++中繼承關系中的同名隱藏和對策