虚函数、虚指针、虚函数表和多态

虚函数、虚指针、虚函数表和多态

B站视频地址

虚函数

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。

虚函数、虚指针、虚函数表和多态_第1张图片 注意空类的大小是1

为什么加入虚函数之后sizeof类的大小会变成4?内部的实现机制是什么?

内部实现了一个虚函数表指针,指针大小是4字节

虚函数、虚指针、虚函数表和多态_第2张图片

虚函数表的生成时机和作用

虚函数表作用

对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。

虚函数、虚指针、虚函数表和多态_第3张图片

虚函数表的生成时机和生成原因

虚函数、虚指针、虚函数表和多态_第4张图片

虚函数表指针

虚函数、虚指针、虚函数表和多态_第5张图片

在编译时期在构造函数中执行vptr赋值的语句(自动进行)程序员看不到

虚函数、虚指针、虚函数表和多态_第6张图片 虚函数、虚指针、虚函数表和多态_第7张图片

虚函数表在支持多态方面的工作原理

类对象在内存中的样子

虚函数、虚指针、虚函数表和多态_第8张图片

对象a的实际大小

虚函数、虚指针、虚函数表和多态_第9张图片

虚函数的原理和多态性的体现

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。

虚函数、虚指针、虚函数表和多态_第10张图片

虚函数、虚指针、虚函数表和多态_第11张图片

代码实现上

虚函数、虚指针、虚函数表和多态_第12张图片虚函数、虚指针、虚函数表和多态_第13张图片

表现形式

1.程序中既存在父类也存在子类,父类中必须含有虚函数子类中也必须重写父类中的虚函数。
2.父类指针指向子类对象,或者父类引用绑定(指向)子类对象。
3.当通过父类的指针或用,调用子类中重写的虚函数时,就能看出多态性的表现了。

虚函数、虚指针、虚函数表和多态_第14张图片

父类和子类的内存布局

虚函数、虚指针、虚函数表和多态_第15张图片

你可能感兴趣的:(c++学习,多态,虚函数,虚指针)