虚函数表-继承
单继承
结论:
当父类定义了虚函数时,在子类进行继承的时候会将父类的虚函数表也给继承下来所以那一些虚函数在子类中也是virtual类型的,如果要对父类中的虚函数进行重写时或添加虚函数,顺序是:(图表说明为图一)
①先将父类的虚函数列表复制过来
②重写虚函数时是把从父类继承过来的虚函数表中对应的虚函数进行相应的替换。
③如果子类自己要添加自己的虚函数,则是把添加的虚函数加到从父类继承过来虚函数表的尾部。
图一👆
在这补充几个点:
第一点:严格说是同一的类的不同对象都有自己的虚函数指针,只是指向相同的虚函数(虚函数表),共用的~
第二点:子类和父类中的虚函数表中没重写的虚函数也是共用的(函数共用,并不是说子类和父类的虚函数表共用哦~~)
虚函数表多继承
Son类继承自Father和Mother类
#include <iostream>
using namespace std;
class Father
{
public:
virtual void func1() { cout << "Father::func1" << endl; }
virtual void func2() { cout << "Father::func2" << endl; }
virtual void func3() { cout << "Father::func3" << endl; }
void func4() { cout << "非虚函数:Father::func4" << endl; }
public:
int x = 200;
int y = 300;
static int z;
};
class Mother
{
public:
virtual void handle1() { cout << "Mother::handle1" << endl; }
virtual void handle2() { cout << "Mother::handle2" << endl; }
virtual void handle3() { cout << "Mother::handle3" << endl; }
public: //为了便于测试,使用public权限 int m = 400;
int n = 500;
};
class Son : public Father, public Mother
{
public:
void func1() { cout << "Son::func1" << endl; }
virtual void handle1() { cout << "Son::handle1" << endl; }
virtual void func5() { cout << "Son::func5" << endl; }
};
利用虚函数指针可以观察到Son类对象的内存分布情况,关于指针的调用在这个链接提到了,有兴趣的可以看看。
结论: 会有两个虚函数指针分别指向Father类中的虚函数表,以及Mother类中的虚函数表(可以理解为有继承自几个不同对象就有多少个虚函数指针)。👇(见下图)
通过vs观察的内存分布情况为👇
多继承的情况下越是靠近子类名称的类的虚函数在虚函数表中更靠前。(上面的例子中就是Father的虚函数更靠前)