虚函数与强制类型转换产生的问题

BaiYangSpirit 2006-05-17 08:30:11
程序源代码:
#include <iostream>
using namespace std;

class Class1
{
public:
virtual void f()
{
cout<<"Virtual Function f() in Class1"<<endl;
}

void g()
{
cout<<"Function g() in Class1"<<endl;
}
};

class Class2
{
public:
virtual void f()
{
cout<<"Virtual Function f() in Class2"<<endl;
}

void g()
{
cout<<"Function g() in Class2"<<endl;
}
};

class Class3
{
public:
virtual void h()
{
cout<<"Virtual Function h() in Class3"<<endl;
}
};

void main(void)
{
Class1 obj1, *p_class1;
Class2 obj2;
Class3 obj3;

p_class1=&obj1;
p_class1->f();
p_class1->g();
cout<<"===========================\n";
cout<<"sizeof(Class1)"<<sizeof(Class1)<<" "
<<"sizeof(obj1)"<<sizeof(obj1)<<endl;
cout<<"===========================\n";

p_class1 = (Class1*)&obj2;
p_class1->f();
p_class1->g();
cout<<"===========================\n";

p_class1 = (Class1*) &obj3;
p_class1->f();
p_class1->g();
// p_class1->h();
}
===========================================================
环境:VC6.0 + winxp sp2
问题:
1:为什么sizeof(Class1)和sizeof(obj1)的大小为4?
2:p_class1 = (Class1*)&obj2;
p_class1->f();
p_class1->g();
这几句中,为什么p_class1->f();的输出结果是:"Virtual Function f() in Class2"?
3:p_class1 = (Class1*) &obj3;
p_class1->f();
p_class1->g();
// p_class1->h();
这几句中,为什么p_class1->h();是不对的?,
而p_class1->f();得输出结果是:"Virtual Function h() in Class3"?
p_class1->g();怎么也会有输出结果?
...全文
123 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
winter_plusplus 2006-05-17
  • 打赏
  • 举报
回复
1.如果类中有虚函数(不管几个),则会有一个指针来维护一个虚函数表。所以大小为4
2.这里用会很危险的,因为Class2 NOT IS A Class1. 之所以能有以上输出,是正好Class2中有h()这个函数,并且两个类结构一样,不属于需函数特性。如果类复杂一点就会出错了。
如果Class2派生至Class1,并改写了虚函数h(),这样用则体现了需函数特性。
3.同样危险,同2。
sinceliuys 2006-05-17
  • 打赏
  • 举报
回复
mark
逸学堂 2006-05-17
  • 打赏
  • 举报
回复
1:为什么sizeof(Class1)和sizeof(obj1)的大小为4?
~~~~~~~~~~
这个4是虚函数指针。
2:这就是虚函数的特性
3:为什么p_class1->h();是不对的,因为p_class1中没有h()函数,
lz,这就是虚函数的特性,多看看书吧。

64,649

社区成员

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

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