虚拟函数目前认识

/*    //虚拟函数的相关操作
#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;//这样的符值是错误的,编译不过去!!
}*/
/*
注意显示结果在使用虚拟函数和不使用虚拟函数的区别!!!!!
在不使用虚拟函数的情况下,也可以通过强制类型转换做一些操作,但它没有虚拟函数灵活和多样!
当使用虚拟函数时,所做的强制类型转换也不起作用,因为,它是后绑定,只根据最后指针所符值
的地址的类型调用!!!
*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值