个人关于 "虚拟函数"的认识,不知道对么?
//虚拟函数的相关操作
#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 计算机论坛