栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++动态绑定技术:虚函数表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++动态绑定技术:虚函数表

C++ 作为面向动态语言,有三大特性:封装、继承、多态。其中多态特性的实现就是基于C++中的虚函数实现的。每一个带有虚函数的类都会有一个虚函数表,那么到底虚函数表中存的什么函数呢?
先看一段代码示例:

#include 

class BaseClass{
public: 
	virtual void fun1(){
		printf("BaseClass::fun1n");
	}
	virtual void fun2(){
		printf("BaseClass::fun2n");
	}

	void funCommon(){
		printf("BaseClass::funCommonn");
	}
};

class SubA :public BaseClass{
public:
	virtual void fun2(){
		printf("SubA::fun2n");
	}
};

class SubB:public SubA{
public:
	virtual void fun1(){
		printf("SubB::fun1n");
	}

};

int main(){
	BaseClass* obj1 = new BaseClass;
	obj1->fun1();
	obj1->fun2();

	BaseClass* obj2 = new SubA;
	obj2->fun1();
	obj2->fun2();

	BaseClass* obj3 = new SubB;
	obj3->fun1();
	obj3->fun2();
	obj3->funCommon();
	return 0;
}

运行以后查看obj3监视:

在监视中可以看到obj3下面有一个_vfptr数组,数组里面有两个变量:函数的指针,分别是:
[0] 0x0034111d SubB::fun1(void)
[1] 0x00341014 SubA::fun2(void)
对象obj3调用函数fun1的时候会调用 SubB::fun1;
对象obj3调用函数fun2的时候会调用 SubA::fun2;
这是因为class SubB继承自class SubA,同时又重写了fun1,当有class SubB生成的对象obj3调用fun1函数时,通过虚函数表查到应该调用SubB::fun1,当调用fun2函数时,通过虚函数表查到应该调用SubA::fun2.所有就完成了一次动态调用。
同类可以查看obj2对象的虚函数表:

原理是一样的。

虚表是属于类的,而不是属于具体的对象,一个类只有一个虚表】。同一个类的所有对象都使用这个虚表。一个继承类的基类如果包含虚函数,那个这个继承类也有拥有自己的虚表,所以继承类的对象也包含一个虚表指针,用来指向它的虚表

aaa

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975157.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号