虚拟函数

虚拟函数


今天看书看到了虚拟函数,我在这里分享一些我学习的总结。虚拟函数是怎样实现一个接口,多种方法的呢,有无关键词Virtual有何区别呢。下面配图和例子来说明。

在这里插入图片描述
当在基类中使用了关键字Virtual,就要使用滞后绑定,系统就会在编译时给每个类生成一张虚拟函数表,如上图,也就是一张虚函数指针表,这些指针指向每个虚函数的地址。而类的对象地址最前面是一个虚表指针,指向了类对应的虚表。运行时系统会根据虚表指针指向的虚函数指针来确定调用虚函数的哪个版本。
在这里插入图片描述这就实现了一个接口,多种方法。如果不加关键字Virtual,系统在编译时就会使用早期绑定,它根据指针对象的类型来确定调用虚函数的哪个版本。所以下面的例子有无Virtual关键字的运行的结果就不同。

#include"stdafx.h"
#include<iostream>
using namespace std;
class Base
{
public:
	virtual void VirtualFun()
	{
		cout<<"class Base!!\n";
	}
};
class Derived:public Base
{
public:
	void VirtualFun()
	{
		cout<<"class Derived!!";
	}
};

void mian()
{
	Base *BasePtr, BaseObject;
	Derived DerivedObject;
	BasePtr = &BaseObject;
	BasePtr->VirtualFun();
	BasePtr = &DerivedObject;
	BasePtr->VirtualFun();	
}

当无关键字Virtual时结果如下:
class Base!!
class Base!!
·BasePtr是基类对象指针,当不加关键字Virtual时,系统就会调用基类的VirtualFun(),所以第二行运行结果也是class Base!!
加上关键字Virtual:
class Base!!
class Derived!!
加上关键字后,系统就用之后绑定,运行时会根据虚表指针实际指向的虚函数指针来确定调用哪个函数,
BasePtr = &DerivedObject;指针指向了派生类,所以第二行的运行结果就是class Derived!!。

讲的不对的请大佬指正本菜鸟^ _ ^。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值