多态的实现原理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在C++的标准规格说明书中说到,编译器必需要保证 虚函数表的指针存在于对象实例中最前面的位置(这 是为了保证正确取到虚函数的偏移量)。
class Base { public: virtual void f() { cout << "Base::f" << endl; } virtual void g() { cout << "Base::g" << endl; } virtual void h() { cout << "Base::h" << endl; } };
C++中的虚函数的作用主要是实现了多态的机制。 关于多态,简而言之就是用父类型别的指针指向其子 类的实例,然后通过父类的指针调用实际子类的成员 函数。
这种技术可以让父类的指针有“多种形态”,这是一 种泛型技术。
虚函数表
•
虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来 实现的。简称为V-Table。
当该类在程序中被使用的时候,其虚函数表如下图所 示:
一般继承(无虚函数覆盖)
一般继承(有虚函数覆盖)
多重继承(无虚函数覆盖)
多重继承(有虚函数覆盖)
1 基类的内存分布情况
class A { void g(){.....} };
sizeof(A)=1;
class A { public: virtual void f() { ...... } void g(){.....} } sizeof(A)=4;
3 动态绑定过程的实现
A c; B e; A *pc=&e; //设置breakpoint,运行到此处 pc=&c;
精品课件!
精品课件!
安全性
一、通过父类型的指针访问子类自己的虚函数 二、访问non-public的虚函数
–
在这个表中,主是要一个类的虚函数的地址表,这张表解决了 继承、覆盖的问题,保证其容真实反应实际的函数。这样,在 有虚函数的类的实例中这个表被分配在了 这个实例的内存中, 所以,当我们用父类的指针来操作一个子类的时候,这张虚函 数表就显得由为重要了,它就像一个地图一样,指明了实际所 应该调用的函数。
1 基类的内存分布情况
例如 我们declare 一个A类型的object : A c; A d; 则编译后其内存分布如下:
2 继承类的内存分布状况
•
源自文库
public B:public A { public : int f() //override virtual function { return 3; } }; 则 A c; A d; B e;