CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

c++的虚函数的局限性??麻烦高人进来指点一下

楼主lionwys(lionwys)2006-03-13 11:16:17 在 C/C++ / C++ 语言 提问

定义基类base   ,以及虚函数test  
  再定义继承自base的子类child,以及虚函数test  
   
  然后    
  child   c;  
  base*   tb   =   %c;  
  此时调用b->test执行child中的test  
   
  然后  
  base   bb   =   *tb  
  base*   tbn   =   &bb  
  此时调用tbn->test执行base中的test  
  问题是,此刻我仍然希望tbn执行的是child中的test,该怎么办?  
   
  换而言之,一旦我们将子类强制保存为父类,其就失去了其原有类型的信息。这是不是虚函数的局限性呢?  
  问题点数:50、回复次数:14Top

1 楼ox_thedarkness()回复于 2006-03-13 11:24:03 得分 5

-       -     问题是你为什么要构造     base   bb   =   *tb;   ?    
   
  注意这里是构造了一个新的对象,而且这个对象本身比他的派生类要小,会丢失所有新增的数据成员。你如何期望他能正确携带派生类的全部信息?  
   
  你可以用   base&   bb   或者   base*   pb。  
   
  唯一的可能是,你期望用   base   容器比如   vector   或者数组解决问题   ——   那么肯定办不到:装不下。   这种情况还是用   vector<   base*   >   vect   或者   base*   ar[];   这样的容器把。Top

2 楼wshcdr(dd)回复于 2006-03-13 11:26:24 得分 0

base   bb   =   *tb  
  base*   tbn   =   &bb  
   
  ////////////  
  base   bb   =   *tb  
  base*   tbn   =   &&bb;  
   
  child*   pChild   =   reinterpre_cast<child*>(tbn)  
  if(pChild)  
          ...Top

3 楼popy007(Twinsen)回复于 2006-03-13 11:26:48 得分 20

base   bb   =   *tb  
   
  这句话会发生object   slicing,也就是将派生类的对象  
   
  削剪成为base类的对象,失去所有child类型信息。  
   
  这种问题的解决方法就是将base做成抽象类,在这种情况下  
   
  base就不能够实例话而导致object   slicing的发生。  
   
  Top

4 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-13 13:24:41 得分 0

虚函数挺好的。Top

5 楼lionwys(lionwys)回复于 2006-03-14 10:10:13 得分 0

popy007:  
  你说的方法不是等于不可行么?Top

6 楼cunsh(村少)回复于 2006-03-14 10:51:03 得分 10

楼主想做什么呀?Top

7 楼cunsh(村少)回复于 2006-03-14 10:52:02 得分 0

如果能像楼主想的那样.那不是要天下大乱呀.Top

8 楼lionwys(lionwys)回复于 2006-03-14 11:17:08 得分 0

我想新建一组类,他们继承一个抽象基类。  
   
  而后我声明的对象全部保存在抽象类数组中。  
   
  但我此刻又需要对这个数组中的内容进行深度拷贝,即获取一个新的具有同样功能的数组。。。  
  Top

9 楼ox_thedarkness()回复于 2006-03-14 11:30:45 得分 0

“而后我声明的对象全部保存在抽象类数组中”  
   
  显然不可能。大小都不一致,你怎么放得下。  
   
  改成:  
  “保存在抽象类指针数组中”  
  比较好。Top

10 楼popy007(Twinsen)回复于 2006-03-14 11:56:04 得分 0

lionwys(lionwys)  
  ==  
   
  object   slicing应该尽量避免。  
   
  你的要求应该用virtual   function来实现,也就是pass   by   pointer   or   reference,  
   
  而不是by   value。Top

11 楼iGray(i_冲锋陷阵)回复于 2006-03-14 14:30:58 得分 10

然后  
  base   bb   =   *tb  
  base*   tbn   =   &bb  
  此时调用tbn->test执行base中的test  
  问题是,此刻我仍然希望tbn执行的是child中的test,该怎么办?  
  //---------------------------------  
  多态,是通过虚函数表实现的。只能在指针(或引用)时发生。即根据“所指(或所引用的)对象的实际类型”调用相应的虚函数。  
   
  base*   tbn   =   &bb;//你看看,tbn指向的bb为base类型,当然不会执行child中的虚函数了  
   
  //=================================  
  我想新建一组类,他们继承一个抽象基类。  
  而后我声明的对象全部保存在抽象类数组中。  
  但我此刻又需要对这个数组中的内容进行深度拷贝,即获取一个新的具有同样功能的数组。。。  
   
  楼主你想法,看来就是想说接口这个概念。  
  定义一纯虚类,来实现一组接口规范,一些子类从该接口派生。当然,数组中保存的是指针或引用。  
   
  Top

12 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-14 16:22:42 得分 5

给base提供一个clone接口  
  child   c;  
  base*   tb   =   &c;  
  此时调用b->test执行child中的test  
   
  base*   tbn   =   tb->clone();   //clone的   内部   return   new   MY_TYPE(*this);  
  tbn->test();   //仍然是child的test  
   
  delete   tbn;  
  tbn   =   0;  
  Top

13 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-14 16:25:50 得分 0

漏了一点,如果clone是开放的...那最好用智能指针.不然就复杂咯~~~~~Top

14 楼lionwys(lionwys)回复于 2006-03-15 13:28:39 得分 0

ok   clone谢谢啦,我了解了Top

相关问题

  • c++关于重载和虚函数的困惑。。。。(请高手指点)
  • 急!急!急! C语言调用汇编函数,大侠请指点!
  • 使用c库函数time()的一些疑问,忘各位指点!
  • c++函数
  • C函数
  • 请指点:函数声明
  • 请指点FindResource函数
  • C++函数手册!
  • 求C#的函数?
  • 再求函数(C#)?

关键词

  • 执行
  • 指针
  • 接口
  • 信息
  • tbn
  • 数组
  • 虚函数
  • tbbase
  • 类
  • 调用

得分解答快速导航

  • 帖主:lionwys
  • ox_thedarkness
  • popy007
  • cunsh
  • iGray
  • Jinhao

相关链接

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

广告也精彩

反馈

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