首页 > 试题广场 >

简述C++虚函数作用及底层实现原理

[问答题]
简述C++虚函数作用及底层实现原理
虚函数的作用:简单讲即实现多态。
基类定义了虚函数,子类可以重写该函数,当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态地调用属于子类的该函数,且这样的函数调用是无法在编译器期间确认的,而是在运行期确认,也叫做迟绑定。

底层实现原理:先来看看C++对象模型



这个模型从结合上面2中模型的特点,并对内存存取和空间进行了优化。在此模型中,non static 数据成员被放置到对象内部,static数据成员, static and nonstatic 函数成员均被放到对象之外。对于虚函数的支持则分两步完成:


1.每一个class产生一堆指向虚函数的指针,放在表格之中。这个表格称之为虚函数表(virtual table,vtbl)。


2.每一个对象被添加了一个指针,指向相关的虚函数表vtbl。通常这个指针被称为vptr。vptr的设定(setting)和重置(resetting)都由每一个class的构造函数,析构函数和拷贝赋值运算符自动完成。


另外,虚函数表地址的前面设置了一个指向type_info的指针,RTTI(Run Time Type Identification)运行时类型识别是有编译器在编译器生成的特殊类型信息,包括对象继承关系,对象本身的描述,RTTI是为多态而生成的信息,所以只有具有虚函数的对象在会生成。

编辑于 2015-06-23 21:32:55 回复(0)
虚函数的作用是使基类指针指向派生类对象时,访问派生类的同名函数,实现动态联编。
原理:每个含有虚函数的派生类对象都有一个或多个(多继承)虚函数表指针,虚函数表指针指向了一个虚函数表,该表中每个表项存放该派生类的虚函数地址,如果该类覆写了基类的虚函数,则存放派生类的虚函数地址,如果未覆写,则存放基类的虚函数地址。
发表于 2015-06-11 14:28:06 回复(0)
编辑于 2015-09-05 18:56:36 回复(3)
要点是要答出虚函数表和虚函数表指针的作用。C++中虚函数使用虚函数表和 虚函数表指针实现,虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地 址,假如子类的虚函数重写了父类的虚函数,则对应在虚函数表中会把对应的虚函数替换为子类的 虚函数的地址;虚函数表指针存在于每个对象中(通常出于效率考虑,会放在对象的开始地址处), 它指向对象所在类的虚函数表的地址;在多继承环境下,会存在多个虚函数表指针,分别指向对应 不同基类的虚函数表。
发表于 2015-05-05 14:30:21 回复(1)
简单来讲是多态,也就是允许派生类对象指向基类指针在运行时调用调用派生类的同名函数。
原理:含有虚函数的类对象,在啊创建时会再头部创建一个指针,指向一个虚表,虚表内保存着虚函数的地址,当调用虚函数时,调用指针指向虚表,子啊虚表中找到虚函数的地址。从而实现运行时多态,普通的成员函数地址是固定的,直接调用即可。
发表于 2015-06-05 10:51:56 回复(0)
虚函数:实现多态功能,达到延迟绑定的效果,具有RTTI的作用。
实现:虚函数指针和虚函数表,以及虚函数表中type_info共同作用。
发表于 2015-07-26 11:10:10 回复(0)
C++虚函数的作用:实现类的多态性
实现原理:虚函数表+虚表指针
发表于 2015-07-10 09:31:39 回复(0)
虚函数的作用:允许在派生类中重新定义与基类同名函数,并且可以通过基类指针或引用来访问基类或派生类同名函数
每个虚函数都在vtable中有一个表项,保存着一条跳转到他的入口地址的指令。
当一个虚函数的对象被创建的时候,他在头部附加一个指针,指向vtable中的相应位置,调用虚函数的时候,不管你是用什么指针调用的,都根据vtable找到入口地址再执行,从而实现了动态联编,而不是像普通函数那样简单的跳转到一个固定的地址
编辑于 2015-06-03 18:48:46 回复(0)