CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

■虚函数、函数重载与静态函数问题

楼主lwjwj1314()2005-04-02 20:55:41 在 VC/MFC / 基础类 提问

 
  我们经常看到,在重载函数或子类虚函数中的最后一条语句都是  
  调用父类的该函数。  
   
  如重载函数的情况:  
  void   CMyView::OnChar(....)  
  {  
        .....  
        CView::OnChar(...);  
  }  
   
  如虚函数的情况:  
  BOOL   CMainFrame::OnCommand(....)  
  {  
        .....  
        return   CFrameWnd::OnCommand(....);  
  }  
   
  但据我所知   CClass::Function()的调用方式是在   Function()是static函数的情况。  
  而我查MSDN,OnChar,OnCommand都不是静态函数,那为什么可以这样调用呢? 问题点数:10、回复次数:6Top

1 楼wangyangcheng(矛盾)回复于 2005-04-02 21:05:43 得分 0

这是指名道姓地调用所指定的类的成员函数。Top

2 楼mscf(扎西特勒)回复于 2005-04-02 21:08:24 得分 0

静态函数是在没有类实例时就能使用它的代码,所以才那么用,在return   CFrameWnd::OnCommand(....);这儿可以理解为名字空间Top

3 楼lwjwj1314()回复于 2005-04-02 21:13:24 得分 0

我用简单的程序表现了上边的问题:  
   
  #include   <iostream.h>  
   
  class   Base  
  {  
  public:  
  void   refunc()  
  {  
  cout<<"Base   refunc"<<endl;  
  }  
  virtual   void   vfunc()  
  {  
  cout<<"Base   vfunc"<<endl;  
  }  
  };  
   
  class   Derive  
  {  
  public:  
  virtual   void   vfunc()  
  {  
  cout<<"Derive   vfunc"<<endl;  
  Base::vfunc();  
  }  
   
  void   refunc()  
  {  
  cout<<"Derive   refunc"<<endl;  
  Base::refunc();  
  }  
  };  
   
  int   main()  
  {  
  return   0;  
  }  
   
  程序报错:  
  error   C2352:   'Base::vfunc'   :   illegal   call   of   non-static   member   function  
  see   declaration   of   'vfunc'  
  error   C2352:   'Base::refunc'   :   illegal   call   of   non-static   member   function  
  see   declaration   of   'refunc'  
   
  Top

4 楼lwjwj1314()回复于 2005-04-02 21:14:52 得分 0

wangyangcheng(矛盾),mscf(扎西特勒)两位说是名字空间:  
   
  那程序如何知道什么时侯是名字空间,什么时候是类名呢?Top

5 楼lwjwj1314()回复于 2005-04-02 21:17:23 得分 0

定义名字空间:  
  #include   <iostream.h>  
   
  namespace   Base  
  {  
  class   Base  
  {  
  public:  
  void   refunc()  
  {  
  cout<<"Base   refunc"<<endl;  
  }  
  virtual   void   vfunc()  
  {  
  cout<<"Base   vfunc"<<endl;  
  }  
  };  
  };  
   
  class   Derive  
  {  
  public:  
  virtual   void   vfunc()  
  {  
  cout<<"Derive   vfunc"<<endl;  
  Base::vfunc();  
  }  
   
  void   refunc()  
  {  
  cout<<"Derive   refunc"<<endl;  
  Base::refunc();  
  }  
  };  
   
  int   main()  
  {  
  return   0;  
  }  
   
  报错:  
  error   C2039:   'vfunc'   :   is   not   a   member   of   'Base'  
  error   C2039:   'refunc'   :   is   not   a   member   of   'Base'  
   
  因此,MFC是怎么实现识别名字空间,还是类名呢?  
  Top

6 楼virtualfunction(virtualfunction)回复于 2005-04-02 21:51:58 得分 10

1、强制调用“基类”虚函数。  
  void   CMyView::OnChar(....)  
  {  
        .....  
        CView::OnChar(....);<---CMyView基类CView的虚函数  
  }  
   
  BOOL   CMainFrame::OnCommand(....)  
  {  
        .....  
        return   CFrameWnd::OnCommand(....);   <---CMainFrame基类CFrameWnd的虚函数  
  }  
   
  2、你的错误!  
  class   Derive  
  {  
  public:  
                    .............  
  void   refunc()  
  {  
  cout<<"Derive   refunc"<<endl;  
  Base::refunc();<---refunc并不是名字空间Base的成员,而是名字空间Base  
                                                                              中类Base的成员函数。  
  };  
                    .............  
  };  
   
  3、下列是MFC的作法  
  class   Derive   :public   Base   <----继承  
  {  
  public:  
  virtual   void   vfunc()  
  {  
  cout<<"Derive   vfunc"<<endl;  
  Base::vfunc();   <-----强制调用基类虚函数  
  };  
   
  void   refunc()  
  {  
  cout<<"Derive   refunc"<<endl;  
  Base::refunc();   <-----强制调用基类虚函数  
  };  
  };  
   
   
  Top

相关问题

  • 函数重载是静态连编,还是动态?
  • 函数重载
  • 函数重载?
  • 虚函数的重载问题
  • 关于重载虚函数的问题!!!!
  • 虚函数 重载 覆盖 的问题。
  • 为什么静态成员函数不能做成虚函数?
  • 请教:C++中重载与虚函数关系!
  • MFC中虚函数重载后出现了问题?
  • 虚拟函数和重载的题目,不懂啊!!!!!!!!!

关键词

  • 函数
  • 重载
  • 虚函数
  • 静态
  • oncommand
  • onchar
  • 调用
  • 情况

得分解答快速导航

  • 帖主:lwjwj1314
  • virtualfunction

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo