虚继承和虚函数

本文解释了虚继承的原理,如何防止菱形继承问题,以及虚函数的概念,包括非虚函数与虚函数的区别,以及动态绑定在多态中的应用。通过C++示例,展示了虚函数表的作用和重写时的行为。
摘要由CSDN通过智能技术生成

刚刚看了虚继承和虚函数的原理,为了防止遗忘在此浅浅记录。

虚继承

为了防止菱形继承,例如公共父类A,A中有成员int a,B继承A,C继承A,D同时继承B和C,则D中含有两份a,一份来自B,一份来自C,
使用时除非指定是哪个,如D dd;     dd.B::a = 1;     dd.C::a = 2;
如果使用虚继承,class B :virtual public A,class C :virtual public A,则B,C会创建一个虚基表指针指向虚基表(A),在D中,含有4个区域,B,C区域,这两个区域含有B,C自身的成员以及虚基表指针,还有一个虚基表区域,以及D自身成员区域。
(虚基表指针存放偏移量,B或C区域开始的位置加上偏移量即为目标成员位置)

虚函数(多态)

如果有一个父类A,含有父类成员函数speak(非虚函数),子类B继承父类,子类重写父类函数speak,此时创建一个父类指针指向子类对象,A* a = new B;,a->speak();,调用的还是父类的函数。(原理:C++自动类型转换,仍然为A类型,调用的A的函数)

如果A的speak函数为虚函数,则子类重写父类虚函数后,A* a = new B;,a->speak();,此时调用的为子类的函数。

原理:父类函数定义为虚函数时,在编译阶段编译器增加了一个vptr指针,但此时vptr指针并没有初始化指向虚函数表(vtable),当调用构造函数时,初始化vptr指针,使之指向本对象的虚函数表。若子类没有重写则指向父类的函数,若重写了则覆盖,指向子类的虚函数。、

例如:若有一个父类A,一个父类B,各自含有一个虚函数,当C继承A和B时,若C重写该函数,则实例化C后调用的为C的函数,若无重写则编译器报错,不知道时A还是B的函数。

参考:

C++语法——详解虚继承-CSDN博客

50 C++ - 如何实现动态绑定_c++怎样实现消息的动态绑定请简单说明下实现过程-CSDN博客

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值