CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

请问关于虚函数

楼主chinayang9(中国杨)2003-11-02 09:23:27 在 C/C++ / C语言 提问

什么是虚函数,具体应用怎样?  
   
  请高手指教。 问题点数:20、回复次数:21Top

1 楼herrycsdn(卓一凡)回复于 2003-11-02 09:30:35 得分 0

C++为实现晚捆绑,而使用虚函数,  
  我觉得你还是找本c++的书,看看比较好Top

2 楼yufeng1979(独行者)回复于 2003-11-02 09:39:31 得分 0

Classes   are   abstract   classes   if   they   contain   pure   virtual   functions   or   if   they   inherit   pure   virtual   functions   and   do   not   provide   an   implementation   for   them.   Pure   virtual   functions   are   virtual   functions   declared   with   the   pure-specifierTop

3 楼BestYunnan201(毛主席教导我们:好好学习,天天向上)回复于 2003-11-02 09:43:25 得分 0

关于这个问题要说的真是太多了,三言两语是说不完的!  
  找本书看好了Top

4 楼chinayang9(中国杨)回复于 2003-11-02 09:46:06 得分 0

我现在手上是有书的,但觉得自己比较适合那种用实例或者听人讲解的学习方法。  
   
  能不能给出一个虚函数的例子啊?Top

5 楼BestYunnan201(毛主席教导我们:好好学习,天天向上)回复于 2003-11-02 10:04:23 得分 7

虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。  
   
  虚函数“虚”就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。  
  例如:  
   
  class   A  
  {  
  public:  
          virtual   void   foo()   {   cout   <<   "A::foo()   is   called"   <<   endl;}  
  };  
   
  class   B:   public   A  
  {  
  public:  
          virtual   void   foo()   {   cout   <<   "B::foo()   is   called"   <<   endl;}  
  };  
   
  在使用的时候,我们可以这样:  
   
  A   *   a   =   new   B();  
  a->foo();               //   在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!  
                                  //有了虚函数它就不会去调用A了  
  Top

6 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-02 17:12:26 得分 4

class   Base  
  {  
      void   F(){}  
      virtual   void   VF(){}  
  };  
   
  class   Derived  
      :public   Base  
  {  
      void   F(){}  
      void   VF()   {}  
  };  
   
  int   main()  
  {  
      Base   *   pb   =   new   Derived;  
      pb->F();  
      pb->VF();  
  }  
   
  单步调试一下就明白Top

7 楼angelface(§<@#$&^%$>§)回复于 2003-11-02 20:14:37 得分 0

真的还是找本书好好看看吧,   这个问题,   在这里真的是说不清,Top

8 楼snwcwt(风舞影天)回复于 2003-11-02 21:27:42 得分 0

楼主学习方法没对,自学能力太差了Top

9 楼skywolf8183(天狼星)回复于 2003-11-02 21:38:52 得分 0

C++得多态,就是表现在许函数上面,可以说,不懂虚函数的人,就不懂的C++  
  在继承中,字类继承父类,会自动生成一个父类函数的拷贝,此时在自类中生成的对象,如何正确调用需要的函数呢?  
  虚函数的出现,函数可以出现了多个版本的拷贝,这样就不会出现在继承中的调用函数的2异性,达到多态的特征。可以参考thing   in   c++  
  Top

10 楼boluoCTO(菠萝项目经理)回复于 2003-11-02 23:27:07 得分 0

找本书看看迟后联编是怎么回事就知道了.Top

11 楼panzhaoping(潘赵平)回复于 2003-11-03 01:05:59 得分 0

参见   inside   c++   object       lippermanTop

12 楼GameWeaver(大白菜)回复于 2003-11-06 12:57:46 得分 4

虚函数定义:  
  如果一个函数被定义为虚函数,那么即使是使用指向基类对象的指针来调用该成员函数,C+也能保证所调用的是正确的特定于实际对象的成员函数。  
  示例:  
  calss   A  
  {  
  public:  
      virtual   void   Display()  
      {  
          cout<<"A"<<endl;  
      }  
  };  
  class   B:public   A  
  {  
      virtual   void   Display()  
      {  
          cout<<"B"<<endl;  
      }  
  }  
  void   main()  
  {  
      A   *pA;  
      pA   =   new   B;  
      pA->Display();  
      cin.get();  
      delete   pA;  
  }Top

13 楼GameWeaver(大白菜)回复于 2003-11-06 13:38:48 得分 0

纯虚函数:  
          一个不仅可以被重新定义,而且必须被重新定义的成员函数成为纯虚函数,只需给虚函数制定一个0值(更有效说法是一个空指针),就可将虚函数转化成纯虚函数。  
          当一个类含有至少一个纯虚函数时,这个类就成为抽象类,无法用该类来建立对象。  
  示例代码:  
  calss   A  
  {  
  public:  
      virtual   void   Display()=0;  
  };Top

14 楼Iverson_0(小春)回复于 2003-11-06 14:52:26 得分 0

vtable是虚函数的关键Top

15 楼woxihuanbohe(我喜欢)回复于 2003-11-06 15:07:49 得分 0

虚拟函数需要在继承体系中才有效,通过vtable维护,对象通过vtable调用到对应的函数。Top

16 楼mituzhishi(慎独)回复于 2003-11-06 15:09:53 得分 0

还是找本书好好看看吧!Top

17 楼bing_huo(我是一个演员!)回复于 2003-11-06 15:25:05 得分 5

#include   <iostream>  
   
  using   namespace   std;  
   
  class   A  
  {  
    public:  
          virtual   void   test(){cout<<"test   in   class   A"<<endl;}  
  };  
   
  class   B   :public   A  
  {  
    public:  
          void   test(){cout<<"test   in   class   B"<<endl;}  
  };  
   
  void   fun(A   *p)  
  {  
        p->test();  
  };  
   
  void   main()  
  {  
        A   *pA;  
        A   a;  
        *pA   =&a;  
        B   b;  
        *pA   =&b;  
        fun(pA);  
  }  
   
  楼主运行一下上面的例子,这个就是最简单的多态,函数fun(A   *p)接受一个base类的指针,但是却能根据运行时这个指针所指向的具体对象来确定调用哪个版本的test()函数,这就是楼上说的晚绑定或者叫迟后联编,这也是面向对象程序设计最基本的东西。  
         
   
  Top

18 楼bing_huo(我是一个演员!)回复于 2003-11-06 15:26:16 得分 0

void   main()  
  {  
        A   *pA;  
        A   a;  
        pA   =&a;  
        fun(pA);  
        B   b;  
        pA   =&b;  
        fun(pA);  
  }  
   
  main函数里有错误   更正  
  Top

19 楼hamlet2003(哈姆莱特)回复于 2003-11-06 16:05:00 得分 0

通过vtable实现对衍生函数的间接呼叫。  
      参看《深入浅出mfc>>Top

20 楼zcnaonao(上帝不爱我)回复于 2003-11-06 20:07:43 得分 0

随便去个书店找本c++基础书,看上他半个小时基本上就差不多懂了Top

21 楼codewarrior(会思考的草)回复于 2003-11-06 20:17:00 得分 0

回去看书再来Top

相关问题

  • 虚函数?
  • 纯虚函数!
  • 虚函数
  • 散分!!纯虚函数与虚函数??
  • 非虚函数调用虚函数?
  • 关于虚函数。。
  • 关于虚函数
  • 虚函数问题!
  • 关于虚函数
  • 虚函数问题

关键词

  • c++
  • 函数
  • 指针
  • virtual
  • pb
  • 虚函数
  • 调用
  • pa
  • 类
  • 对象

得分解答快速导航

  • 帖主:chinayang9
  • BestYunnan201
  • Wolf0403
  • GameWeaver
  • bing_huo

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

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