当一个类中有一个或多个虚函数时,内存中会多一个虚指针(vptr,virtual pointer),指向一个虚表(vtbl,virtual table)
父类有虚函数,则子类一定有虚函数
在下图示意图中,我们可知,B继承A,C继承B。
A有两个虚函数,B继承A则也有两个虚函数,同时B对虚函数vfunc1进行了重写,同理,C继承B,则C也有两个虚函数,C对虚函数vfunc1也进行了重写。故在内存中,A B C对应的虚函数vfunc2是同一个均为A::vfunc2,对应的虚函数vfunc1分别为A::vfunc1,B::vfunc1,C::vfunc1。
c++编译器遇到函数调用时,会有两个考量,是静态绑定还是动态绑定,静态绑定是call xxx地址,即一定调用到某个地址,动态绑定可以调用到不同的地址
动态绑定需符合三个条件:
- 通过指针调用(对象调用函数是静态绑定)
- 指针是向上的关系,向上关系是指,比如 父类 名称 = new 子类(),这样的关系即是一种向上的关系
- 调用的是虚函数
虚函数的这种用法,称之为多态。
示例程序:
#include<iostream>
using namespace std;
class A {
public:
A(int data1, int data2) :m_data1(data1), m_data2(data2) {
}
virtual void vfunc1() {
cout << "调用的是A的vfunc1"<< endl; }
virtual void vfunc2() {
cout << "调用的是A的vfunc2" << endl; }
void func1() {
cout << "调用的是A的func1" << endl; }
void func2() {
cout << "调用的是A的func2" << endl; }
void getData