Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2400|回复: 0
打印 上一主题 下一主题

调用基类函数

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2015-10-15 13:48:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在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都是派生类,易看出,这里都涉及到了在派生类函数中调用基类函数,
我最开始对这种用法挺好奇,不太明白他们的意思,觉得只有静态成员函数才能用类名来直接调用函数,

其实,

派生类成员函数可以调用基类成员函数,在派生类的普通成员函数中,使用基类作用域调用基类的静态成员函数和普通成员函数都可以下面用一个具体的实例来验证这一点:
  1. #include "iostream"
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6.         int m;
  7.         int n;
  8. public:
  9.         void function1()
  10.         {
  11.                 cout<<"这是基类的普通函数function1\n";
  12.         }
  13.         void virtual function2()
  14.         {
  15.                 cout<<"这是基类的虚函数function2\n";
  16.         }
  17.         static void function3()
  18.         {
  19.                 cout<<"这是基类静态成员函数function3\n";
  20.         }
  21. };

  22. class B:public A
  23. {
  24. public:
  25.         void function1()
  26.         {
  27.                 A::function1();
  28.         }
  29.         void  function2()
  30.         {
  31.                 cout<<"这是派生类的函数function2\n";
  32.                 A::function2();
  33.         }
  34. };


  35. int main()
  36. {
  37.         B b;
  38.         b.function1(); // (1)
  39.         b.function2(); // (2)
  40.         A::function3();// (3)

  41.         A *a;
  42.         a=new B;
  43.         a->function1(); // (4)
  44.         a->function2(); // (5)
  45.         a->function3(); // (6)</span>
复制代码
这段代码的输出结果为分析:(1) (2)其实就是测试派生类函数调用基类的函数,在B类中,function1直接调用A类的function1,function2 相当于重写了A类的function2函数,因为加入了新的语句(3)是测试用类名直接调用类中的静态成员函数(4)(5)(6)其实是在测试多态,只有function2函数才会调用子类的函数,其他的都只调用基类的函数,因为function2是虚函数,这也是虚函数在多态中的作用(动态联编)

另外,由于B是A类的派生类,function3是A类的静态函数,

所以,也可以直接用B::function3(); 来调用function3



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 04:34 , Processed in 0.059579 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表