个人关于 "虚拟函数"的认识,不知道对么?

sunlu_eric 2008-03-11 03:50:03
//虚拟函数的相关操作
#include <iostream.h>
class Base
{
public:
int num;
public:
Base():num(10)
{
}
virtual void Show()
{
cout<<"Base :"<<num<<endl;
}
};
class Driver:public Base
{
public:
int num;
public:
Driver():Base(),num(20)
{
}
void Show()
{
cout<<"Driver:"<<num<<endl;
}
};

void main()
{
////////////////////
//变量处理
////////////////////
Base base;
Driver driver;
cout<<"正常变量显示:"<<endl;
base.Show();
driver.Show();
cout<<"变量强制类型转换显示:"<<endl;
((Driver *)(&base))->Show();
((Base *)(&driver))->Show();

/////////////////////
//指针处理
/////////////////////
Base *pbase=new Base;
Driver *pdriver=new Driver;
cout<<"正常指针显示:"<<endl;
pbase->Show();
pdriver->Show();
cout<<"指针强制类型转换显示:"<<endl;
((Driver *)pbase)->Show();
((Base *)pdriver)->Show();
cout<<pbase->num<<"*****"<<((Base *)pbase)->num<<"*****"<<((Driver *)pbase)->num<<endl;
//因为pbase所指的地址就只是pbase(包括int num和一个虚拟表指针,等???)
//,没有对Driver类中对应的int num;初始化所以是一个随机的值
cout<<"重新符值显示:"<<endl;
pbase=pdriver;
pbase->Show();
((Base *)pbase)->Show();//在此用强制类型转换也是没有用的,因为它在前面符值为pdriver,
//当调用虚拟函数时,就调用pdriver的类型的虚拟函数
((Driver *)pbase)->Show();
cout<<pbase->num<<"*****"<<((Base *)pbase)->num<<"*****"<<((Driver *)pbase)->num<<endl;
//而这时候因为pbase所指的指针是Driver,他的内存空间包括Base中的int num,自己的int num 和一个虚拟表
//指针,等???所以读出的内容也就是固定的(要保证你在操作中已经对Base中的int num 做符值操作了)
//pdriver=pbase;//这样的符值是错误的,编译不过去!!
}*/
/*
注意显示结果在使用虚拟函数和不使用虚拟函数的区别!!!!!
在不使用虚拟函数的情况下,也可以通过强制类型转换做一些操作,但它没有虚拟函数灵活和多样!
当使用虚拟函数时,所做的强制类型转换也不起作用,因为,它是后绑定,只根据最后指针所符值
的地址的类型调用!!!
*/


欢迎大家访问:http://www.talkttbbs.com 计算机论坛
...全文
120 2 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunlu_eric 2008-03-12
  • 打赏
  • 举报
回复
谢谢你的回复!

欢迎大家访问:http://www.talkttbbs.com 计算机论坛

在上面俺还有几个问题! 这是个新计算机论坛也希望您支持下!
hityct1 2008-03-11
  • 打赏
  • 举报
回复
楼主研究的仔细啊。不过,既然都多态了,强制转换也没什么意义了。
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-11 03:50
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下