C++派生類函式呼叫基類的函式
阿新 • • 發佈:2019-02-15
在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