关于空虚类问题!

wangxintu 2005-06-29 12:00:49
类的继承情况如下:
TThread   基类:A
CSenThread  A的派生类:B
CSenComm   B的派生类:C
在B中声明virtual int __fastcall WaitByte(BYTE * des, DWORD size) = 0;
在C中声明virtual int __fastcall WaitByte(BYTE * des, DWORD size);并实现。
现在B中调用int ReadBytes = WaitByte( Buf, sizeof(Buf) );此时如何解释?
...全文
150 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxintu 2005-07-04
  • 打赏
  • 举报
回复
怎么结贴呢?
wangxintu 2005-07-04
  • 打赏
  • 举报
回复
daseny(胡杨) ,谢谢你这么耐心的给我讲,我稍稍明白了一点。C++没学好,现在感觉实在不够用,边工作边学又觉得很多地方看不懂,就来这里请都你们这些高手,希望多多照顾!
daseny 2005-06-30
  • 打赏
  • 举报
回复
C派生自B,B的指针可以合理地指向C对象;但是如果C又是一个虚基类,那么是不存在C对象,也就是说你直接声明一个C对象会被编译器报错,所以这时B指针是可以指向但是没有对象可以指。

严格来说,加上强制类型转换,指针可以指向任何东西;但是合理地,指针只能指向同类型的对象,而子类对象也可以看作父类对象,所以指向派生类对象也是合理的。

类B继承自非虚基类A,A定义了虚函数foo(),B也实现了这个函数。
如果有一个A指针 pA,在代码中这样调用 pA -> foo() ,那么将检查 pA 实际指向的对象类型,并调用相应的foo方法(可能是A实现的,也可能是B实现的)。
但是如果是一个A对象 a,在代码中调用 a.foo() ,那么将直接调用A的foo方法。

这时很合理的。自己想想。
wangxintu 2005-06-29
  • 打赏
  • 举报
回复
那是调用C中的实现吗?我在B中调用还要用B的指针?
beyondtkl 2005-06-29
  • 打赏
  • 举报
回复
现在B中调用int ReadBytes = WaitByte( Buf, sizeof(Buf) );此时如何解释?

虚函数的调用呀? 应该是通过A,or B的对象指针 或引用调用的。。不然没有效果。
wangxintu 2005-06-29
  • 打赏
  • 举报
回复
不好意思,我是新人,分数不多,请大家多多照顾!
wangxintu 2005-06-29
  • 打赏
  • 举报
回复
如果C又是一个虚基类,那B的指针也不能指向C的对象是吗?也就是只能指向非虚基类和派生类的对象是这样吗?
对象还是直接调用?是什么意思?你不是说不能有对象吗?
daseny 2005-06-29
  • 打赏
  • 举报
回复
B定义了一个纯虚函数,那它就是一个虚基类,不能拥有实例对象的。
实际中可以定义一个B指针,指向C对象,用B指针直接调用,C++会自动调用C的这个方法。
如果你有另外一个继承自B的类D也实现了这个方法,那么用指向D对象的B指针直接调用也会自动调用D的这个方法。
也就是说,通过基类指针调用虚函数会自动判断实际指向对象的类型并调用相应的方法。
但是也只是指针和引用有效,对象还是直接调用。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧