现在的位置: 首页 > 综合 > 正文

虚拟函数目前认识

2012年10月19日 ⁄ 综合 ⁄ 共 1360字 ⁄ 字号 评论关闭
/*    //虚拟函数的相关操作
#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;//这样的符值是错误的,编译不过去!!
}*/
/*
注意显示结果在使用虚拟函数和不使用虚拟函数的区别!!!!!
在不使用虚拟函数的情况下,也可以通过强制类型转换做一些操作,但它没有虚拟函数灵活和多样!
当使用虚拟函数时,所做的强制类型转换也不起作用,因为,它是后绑定,只根据最后指针所符值
的地址的类型调用!!!
*/

抱歉!评论已关闭.