这个问题不明白,请指教!

huiler 2001-07-09 05:37:10
#include "iostream.h"

class a
{
public:
virtual void s() {cout<<"a::s()\n\n";}
};

class b :public a
{
public:
int m_data1;
void func() {cout<<"b::func()"<<endl;
s();
}
virtual void s(){cout<<"b::s()\n\n";}
};

class c:public b
{
public:
int m_data2;
virtual void s(){cout<<"c::s()\n\n";}
};

void main()
{
c mydoc;
c *pmydoc=new c;
cout<<"#1 testing"<<endl;
mydoc.func();

cout<<"#2 testing"<<endl;
((b*)(&mydoc))->func();

cout<<"#3 testing"<<endl;
pmydoc->func();

cout<<"#4 testing"<<endl;
((b)mydoc).func();
}

该执行的结果为:
#1 testing
b::func()
c::s()

#2 testing
b::func()
c::s()

#3 testing
b::func()
c::s()

#4 testing
b::func()
b::s() --->>注意,问题来了!因为派生类已经修改了虚拟函数s(),那么理当调用派生类的s(),但是到了第四项测试时为什么变成了是调用b类的s()呢?请帮帮小弟!!!

...全文
80 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
huiler 2001-07-11
  • 打赏
  • 举报
回复
明白了。谢谢你!!给你100分吧!
liu_feng_fly 2001-07-10
  • 打赏
  • 举报
回复
看看《深入浅出mfc》吧
z_sky 2001-07-10
  • 打赏
  • 举报
回复
仅仅是指针转换的话,是不影响对象本身的,只是告诉系统用一种新的方式(类型)去访问原来的对象实体,原来的对象实体没有任何改变;
而((b)mydoc).func();不同,它是按mydoc创建一个新的临时的class b 的对象,然后将mydoc copy过去,再调用临时的class b 的对象的func();
huiler 2001-07-10
  • 打赏
  • 举报
回复
((b*)(&mydoc))->func()
这个就没有转换吗?望指明!谢谢了!

z_sky 2001-07-09
  • 打赏
  • 举报
回复
((b)mydoc).func();
作为对象实体类型转换(非指针),用了缺省的拷贝构造函数建立了一个新的 class b的对象,相当于:
b objb; objb.func();

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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