在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