1. 程式人生 > >C++派生類函式呼叫基類的函式

C++派生類函式呼叫基類的函式

在MFC的程式中,我們經常會看到下面的程式片段,

片段一:

BOOL CClassDlg::OnInitDialog()

{

       CDialog::OnInitDialog();

       //。。。。

       //。。。。

       AddTree();    

       returnTRUE;  // return TRUE unless you set thefocus to a control

                     // EXCEPTION: OCX Property Pagesshould return FALSE

}

片段二:

void CMyPosDlg::OnClose()

{

       if(AfxMessageBox("確定要退出嗎?",MB_YESNO)==IDYES)     

              CDialog::OnClose();

}

 片段三:

int CMyPosApp::ExitInstance()

{

       //TODO: Add your specialized code here and/or call the base class

       if(m_pConnection->State)

              m_pConnection->Close();///如果已經打開了連線則關閉它

       return CWinApp::ExitInstance();

}


前兩段程式碼中 CDialog 是基類,CClassDlg和CMyPosDlg都是派生類,易看出,這裡都涉及到了在派生類函式中呼叫基類函式,
我最開始對這種用法挺好奇,不太明白他們的意思,覺得只有靜態成員函式才能用類名來直接呼叫函式,

其實,

派生類成員函式可以呼叫基類成員函式,
在派生類的普通成員函式中,使用基類作用域呼叫基類的靜態成員函式和普通成員函式都可以
下面用一個具體的例項來驗證這一點:
<span style="font-size:18px;">#include "iostream"
using namespace std;
class A
{
public:
	int m;
	int n;
public:
	void function1()
	{
		cout<<"這是基類的普通函式function1\n";
	}
	void virtual function2()
	{
		cout<<"這是基類的虛擬函式function2\n";
	}
	static void function3()
	{
		cout<<"這是基類靜態成員函式function3\n";
	}
};

class B:public A
{
public:
	void function1()
	{
		A::function1();
	}
	void  function2()
	{
		cout<<"這是派生類的函式function2\n";
		A::function2();
	}
};


int main()
{
	B b;
	b.function1(); // (1)
	b.function2(); // (2)
	A::function3();// (3)

	A *a;
	a=new B;
	a->function1(); // (4) 
	a->function2(); // (5)
	a->function3(); // (6)</span>
<span style="font-size:18px;">
	return 0;
}</span>

這段程式碼的輸出結果為
分析:
(1) (2)其實就是測試派生類函式呼叫基類的函式,
在B類中,function1直接呼叫A類的function1,
function2 相當於重寫了A類的function2函式,因為加入了新的語句
(3)是測試用類名直接呼叫類中的靜態成員函式
(4)(5)(6)其實是在測試多型,只有function2函式才會呼叫子類的函式,其他的都只調用基類的函式,因為function2是虛擬函式,這也是虛擬函式在多型中的作用(動態聯編)

另外,由於B是A類的派生類,function3是A類的靜態函式,

所以,也可以直接用B::function3(); 來呼叫function3