CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

派生类中重定义函数与虚函数应用的区别!

楼主dail178(大龙)2003-11-04 18:37:09 在 C/C++ / C++ 语言 提问

我是C++的新手.近来看到了虚函数这一块.想到以前看到的派生类中的重定义函数.感觉两者功能差不多.但我知道虚函数肯定有很多优越的地方,那位能指点指点我,告诉我两者的其区别么?谢谢!! 问题点数:20、回复次数:9Top

1 楼sky_blue(蓝天2007)回复于 2003-11-04 19:12:43 得分 0

虚函数更容易抽象。Top

2 楼carbon107(<软件开发思想.h>)回复于 2003-11-04 19:15:26 得分 10

虚函数是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的!  
   
          这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。  
   
          虚函数只能借助于指针或者引用来达到多态的效果,如果是下面这样的代码,则虽然是虚函数,但它不是多态的:  
   
  class   A  
  {  
  public:  
          virtual   void   foo();  
  };  
   
  class   B:   public   A  
  {  
          virtual   void   foo();  
  };  
   
  void   bar()  
  {  
          A   a;  
          a.foo();       //   A::foo()被调用  
  }  
   
   
   
  重定义函数功能可没有虚函数强,你想想是不是这回事啊Top

3 楼yuantao(cfan)回复于 2003-11-04 22:25:30 得分 0

楼上的说的很对,虚拟是c++类继承的基础  
  重载其实就是为了方便点使用,使功能类似的方法可以用一个名字表示Top

4 楼fifo2003(o奇迹再现o)回复于 2003-11-05 21:05:18 得分 0

up  
  Top

5 楼hezhipei1182(何)回复于 2003-11-05 21:11:39 得分 0

好像是!  
   
  当你使用派生类指针指向父类的时候,只有虚函数才可以正确的调用相应的实现Top

6 楼hezhipei1182(何)回复于 2003-11-05 21:19:02 得分 0

说错了,是基类指针指向派生类时,正如   carbon107(&lt;软件开发思想.h&gt;)所说Top

7 楼tianxueshan(tianxueshan)回复于 2003-11-06 14:19:21 得分 10

首先要说明的是。C++的编译器比C的更严格。在继承中除了同一作用域的函数重载。  
  如:  
      class   A  
      {  
          public:  
            void   g(int);  
            void   g(float);  
  };  
  这时重载。  
  在C++中有隐藏。重载。覆盖等概念。  
  当:  
    class   B:public   A  
  {  
      public:  
          void   g();  
  };  
  这时B中的成元函数只是覆盖了A类  
      中的f()当然B中g()不是重载了A类的成  
  员函数。因为不是相同的作用域。  
  隐藏就是虚函数的概念,当然要想完全了解虚函数的机制还得  
  了解其内部的机制。这也并非三言两语说得清的。  
  Top

8 楼qybei(qybei)回复于 2003-11-07 18:04:24 得分 0

建议你看一下《Effective   C++》,里面讲有很多这方面的细节,很好的Top

9 楼hafent(大海扬波)回复于 2003-11-20 21:05:05 得分 0

嗯,支持   carbon107(&lt;软件开发思想.h&gt;)   (Top

相关问题

  • 自定义函数与系统函数的区别
  • 怪事,派生类必须全部重定义基类同名虚函数?
  • 自定义函数中前有__fastcall,和没有__fastcall的区别,!
  • 函数定义funtion(int *a)和funtion(int* a)有什么区别?
  • 菜问题:内联函数和宏定义的区别
  • 在定义子函数时,用sub 函数名()和function 函数名()有什么区别?
  • 静态成员函数与一般成员函数有什么区别?怎样定义静态成员函数?
  • 自定义函数
  • 自定义函数
  • 自定义函数

关键词

  • c++
  • 函数
  • 指针
  • virtual
  • 虚函数
  • 重载
  • 派生类
  • 调用
  • 类
  • 指向

得分解答快速导航

  • 帖主:dail178
  • carbon107
  • tianxueshan

相关链接

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

广告也精彩

反馈

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