一篇文章带你学懂C++虚函数表的继承问题

虚函数表-继承

单继承

结论:
当父类定义了虚函数时,在子类进行继承的时候会将父类的虚函数表也给继承下来所以那一些虚函数在子类中也是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的虚函数更靠前)

  • 14
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值