C++虚函数原理

目录

虚函数表的布局

无继承关系的虚函数

存在继承关系的虚函数

单继承:子类不覆盖基类虚函数的情况

单继承:子类覆盖了基类的一个虚函数的情况

单继承:定义了基类没有的虚函数

多继承:存在虚函数覆盖同时又存在自身定义的虚函数的类对象布局

多继承:如果有三个基类: 虚函数表分别是有, 没有, 有

父子对象指针间的转换与函数调用


虚函数表的布局

无继承关系的虚函数

如果一个类中声明了一个虚函数,那么编译器就会为这个类在所有变量的前面增加了一个void **的指针变量__vfptr(注意不是数组),我们称__vfptr指向的void*数组为虚函数表

这个类每添加一个虚函数,void **变量__vfptr里就会增加一个void*的指针

同一个类的不同实例都有一个__vfptr指针,指向同一个虚函数表

虚函数表保存在哪里? 

  1. 它是编译器在编译时期为我们创建好的, 只存在一份
  2. 定义类对象时, 编译器自动将类对象的__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() {}
};

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值