CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

菜鸟问题,怎样才能让基类调用派生类方法

楼主berniechen0123(要不我也起个名)2006-03-02 17:38:31 在 C/C++ / C++ 语言 提问

如题 问题点数:20、回复次数:13Top

1 楼antter(JiangMiao)回复于 2006-03-02 17:41:30 得分 0

virtual   functionTop

2 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-02 18:06:40 得分 5

还有就是像ATL/WTL那样...  
   
  template<typename   _Derived>  
  class   base  
  {  
  public:  
          void   fun(){   static_cast<_Derived*>(this)->xxx();   }  
  };  
   
  class   X:   public   base<X>  
  {  
  public:  
        void   xxx(){}  
  };Top

3 楼popy007(Twinsen)回复于 2006-03-02 18:26:40 得分 5

如果是基类中的virtual   function,并且派生类也对其进行了override,则  
   
  用基类的指针或者引用操纵派生类的指针或引用可以通过自动upcast直接使用派生类。  
   
  如果基类中没有派生类的一个函数,而通过基类的指针或者引用操纵派生类的指针或引用,  
   
  必须用显示downcast才可以使用,比如:  
   
  class   Base   {};  
  class   Derived   :   public   Base   {  
  public:  
      void   f()   {   cout   <<   "Derived::f()\n";   }  
  };  
   
  Base*   bptr   =   new   Derived;  
  static_cast<Derived*>(bptr)->f();  
   
  或者  
   
  ((Derived*)(bptr))->f();  
   
  否则会得到编译器错误。Top

4 楼zhNKUjw(淡淡的云彩悠悠的游)回复于 2006-03-02 20:20:30 得分 5

可以用dynamic_cast操作符,允许在运行时刻进行类型转换,使程序能在同一个类层次中转换类型,将基类指针转换成派生类指针。  
        class   Base   {...};  
        class   Derived   :   public   Base   {...};  
        Base   *base;  
        dynamic_cast<   Derived*   >   base   将基类指针base转化成Derived类型  
  Top

5 楼zhwang_1999(阳光灿烂)回复于 2006-03-02 21:00:51 得分 0

我觉得一般情况下,用虚函数的方法比较好。Top

6 楼berniechen0123(要不我也起个名)回复于 2006-03-03 09:52:15 得分 0

Base*   bptr   =   new   Derived;  
  这样写不是错的吗?  
  那将来delete的时候因该怎么处理  
  delete   (Derived   *)Base;Top

7 楼popy007(Twinsen)回复于 2006-03-03 10:07:49 得分 3

Base*   bptr   =   new   Derived;  
  这样写不是错的吗?  
  那将来delete的时候因该怎么处理  
  delete   (Derived   *)Base;  
  ====  
   
  delete   bptr;  
   
  有两种可能出现:  
   
  1)如果Base::~Base非virtual,那么只调用Base::~Base  
  2)否则,先调用Derived::~Derived,然后Base::~Base  
   
  接着,bptr的空间将会被释放。Top

8 楼popy007(Twinsen)回复于 2006-03-03 10:15:33 得分 2

可以用dynamic_cast操作符,允许在运行时刻进行类型转换,使程序能在同一个类层次中转换类型,将基类指针转换成派生类指针。  
        class   Base   {...};  
        class   Derived   :   public   Base   {...};  
        Base   *base;  
        dynamic_cast<   Derived*   >   base   将基类指针base转化成Derived类型  
  =====  
   
  dynamic_cast的使用需要两个条件:  
   
  1)类的继承关系被设计成真正多态的,也就是说,基类必须有virtual方法,以  
         
        产生vtable机制,因为dynamic_cast依赖于vtable。  
   
  2)运行器类型检测(RTTI)机制必须为可用状态,否则dynamic_cast不能通过RTTI来  
         
        判别被cast的类的真正归属,如果dynamic_cast的使用者错误的使用了它,会发生  
         
        意想不到的后果。如果RTTI没有开启,则dynamic_cast基本等同于static_cast。  
         
        不同的编译器对RTTI的默认情况不用,比如vc中需要-GR的编译参数打开RTTI。  
   
  因此,  
   
  class   Base   {};  
  class   Derived   :   public   Base   {};  
   
  这种情况下dynamic_cast是不能够使用的。Top

9 楼fengfeng2003()回复于 2006-03-03 11:51:05 得分 0

好像就是模板模式吧Top

10 楼zly1980(zly1980)回复于 2006-03-03 13:56:04 得分 0

基类调用派生类的方法?好象思维不是很对。Top

11 楼hyigle_love(parker)回复于 2006-03-03 14:18:21 得分 0

路过学习!正在学习C++,关于RTTI就快要接触到了!Top

12 楼pagechen(天外飞来的仙)回复于 2006-03-03 14:25:06 得分 0

面向对象的设计和编程中,最好不要这样做。  
  如果必须,就定义全局类函数指针。把派生类的某个方法理解为全局方法Top

13 楼berniechen0123(要不我也起个名)回复于 2006-03-03 15:17:54 得分 0

谢谢大家Top

相关问题

  • 菜鸟求教关于派生类调用父类函数
  • 基类和派生的相互调用
  • 当派生类调用基类函数的问题,代码如下
  • 简单的问题,如果在派生类中调用基类方法?
  • 派生类中调用基类的重载操作符的问题
  • 有哪些办法可以在一个类里调用别的类(CView的派生类)的OnPrepareDC() 函数?
  • 在派生类的构造函数后面可以调用基类的构造函数吗
  • 通过基类指针能不能 :调用派生类自己独有的函数
  • 调用一个control类的派生类中的方法出现未将对象实例化
  • 在Delphi中一个派生类如何调用前两重祖先的虚函数?

关键词

  • 指针
  • 转换
  • 类
  • bptr
  • 调用
  • 派生类
  • derived
  • cast
  • dynamic
  • rtti

得分解答快速导航

  • 帖主:berniechen0123
  • Jinhao
  • popy007
  • zhNKUjw
  • popy007
  • popy007

相关链接

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

广告也精彩

反馈

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