目录
多继承:存在虚函数覆盖同时又存在自身定义的虚函数的类对象布局
虚函数表的布局
无继承关系的虚函数
如果一个类中声明了一个虚函数,那么编译器就会为这个类在所有变量的前面增加了一个void **的指针变量__vfptr(注意不是数组),我们称__vfptr指向的void*数组为虚函数表
这个类每添加一个虚函数,void **变量__vfptr里就会增加一个void*的指针
同一个类的不同实例都有一个__vfptr指针,指向同一个虚函数表
虚函数表保存在哪里?
- 它是编译器在编译时期为我们创建好的, 只存在一份
- 定义类对象时, 编译器自动将类对象的__vfptr指向这个虚函数表
存在继承关系的虚函数
单继承:子类不覆盖基类虚函数的情况
class Base1
{
public:
int base1_1;
int base1_2;
virtual void base1_fun1() {}
virtual void base1_fun2() {}
};
class Derive1 : public Base1
{
public:
int derive1_1;
int derive1_2;
};
单继承:子类覆盖了基类的一个虚函数的情况
class Base1
{
public:
int base1_1;
int base1_2;
virtual void base1_fun1() {}
virtual void base1_fun2() {}
};
class Derive1 : public Base1
{
public:
int derive1_1;
int derive1_2;
// 覆盖基类函数
virtual void base1_fun1() {}
};