欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > c++多态

c++多态

2025/9/19 3:21:09 来源:https://blog.csdn.net/m0_55138981/article/details/140050558  浏览:    关键词:c++多态

一、多态是如何体现的?

主要是通过虚函数和运行时类型识别机制。

1、虚函数表:每个包含至少一个虚函数的类都有一个虚函数表。这个表包含了该类及其所有基类的虚函数的地址。当创建派生类对象时,该对象的内存布局会包含一个指向其虚函数表的指针(vfptr)。注:基类有自己的vfptr,派生类连基类的vfptr一起继承。

2、动态绑定:当通过基类指针或引用调用虚函数时,编译器会在运行时通过vptr查找虚函数表,并确定要调用的实际函数(这取决于指针或引用所指向的对象的实际类型)。

3、多态性:由于动态绑定,基类指针或引用可以指向基类或派生类的对象,并调用相应的虚函数。

二、虚函数的底层实现

虚函数的底层是通过虚函数表实现的。当类中定义了虚函数之后,就会在对象的存储开始位置,多一个虚函数指针,该虚函数指针指向一张虚函数表,虚函数表中存储的是虚函数入口地址。

三、虚函数的限制

1、构造函数不能设为虚函数

构造函数的作用是创建对象,完成数据的初始化,而虚函数机制被激活的条件之一就是要先创建对象,有了对象才能表现出动态多态。如果将构造函数设为虚函数,此时构造还未执行完,对象还没创建出来,存在矛盾。

2、静态成员函数不能设为虚函数

虚函数的实际调用:this->vfptr->vtable->virtual function,但是静态成员函数没有this指针,所以无法访问到vfptr。

3、inline函数不能设为虚函数

因为inline函数在编译期间完成替换,而在编译期间无法展现动态多态机制,所以效果是冲突的,如果同时存在,inline失效。

4、普通函数不能设为虚函数

虚函数要解决的是对象多态的问题,与普通函数无关。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com