虚函数总结篇

关于虚函数

核心:虚函数是实现多态机制的核心——通过基类访问派生类,访问过程在程序运行时动态确定。

虚函数

使用基类指针或者引用访问派生类;使用类指针调用成员函数时,普通函数由指针类型确定,而虚函数由指针指向的实际类型决定。

虚函数调用详细过程:

上述说到:虚函数的访问过程在程序执行过程中动态确定,这一过程究竟是怎么执行的?

实际上,当一个类中定义了一个虚函数的时候,这个类的成员变量就会隐式的多一个变量:虚函数表指针(vptr),这个指针指向“虚函数”表,表中的数据为函数指针(指向函数的指针,即存储 函数地址 的变量),(题外话:普通成员函数,虚函数,虚函数表都是一个类的所有对象公有的,成员变量和虚函数表指针(可看作隐式成员变量)是每个对象私有的),因此实际上,虚函数的实现是程序在运行时候,通过对象内存中的vptr找到虚函数表中的相应的函数指针(也就是函数入口地址),然后通过这个表中的函数指针去找到对应的虚函数的实现区域。当类有多个虚函数的时候,仍然只有一个虚函数表指针vptr,但此时虚函数表中有多个函数指针。

纯虚函数

纯虚函数的理念来源于:有时候我们定义一个基类,但是我们并不想,或者并不能够赋予其意义(比如定义动物类,生成一个动物就显得没有意义),这个时候,这个基类叫做抽象类,抽象类只表征某种意义,但不做实现,因此抽象类不能生成对象(创建实例)

因而纯虚函数是定义在抽象类中的虚函数(当然了,并不是说有类分为抽象类和非抽象类,只是说明,因为一个基类中存在了纯虚函数,因此该类是抽象类)。

相当于本质上:定义纯虚函数是为了在基类中实现一个接口,用来规范子类的行为,也即表明了继承该基类的子类必须实现该虚函数。这就是说明了:基类中定义的纯虚函数,在子类中必须实现(否则如果字类也不实现,那么子类依然是抽象类,依然无法实例化)。

关于类与内存

对于一个类 class A,当我们sizeof类A的一个对象,得到的大小是所有成员变量的总的字节数(如果有虚函数,则要加上隐式成员变量vptr的大小(4字节或者8字节)。

类对象中的成员变量存放的位置取决于对象本身的位置,如果对象处于函数内部,那么这些成员变量也在栈空间,如果类对象是new出来的,则就在堆区域。等等......

原文地址:https://www.cnblogs.com/shaonianpi/p/13180675.html