当前位置: 首页 > article >正文

C++之多继承

普通的继承中,子类的虚表是从父类拷贝过来的,子类新增加的特有的虚函数,会添加在这个虚表里。参考文章:CSDN

多继承

问:如果A1、A2中有相同的虚函数,覆盖谁的?

答案:覆盖A1的

多继承还存在一种特殊情况——菱形继承:即此时A1、A2有一个公共的父类。

菱形继承(钻石继承)

继承向上的二义性:

例:Base类中有属性m,我们在Base1的构造函数中将m的值改成2, 在Base2的构造函数中将m的值改成3,那么当Derived中想使用m时,我们取2还是取3?答案是不知道的,在程序中这种情况也是通过不了编译的。为了解决多继承中的菱形继承问题,下面介绍虚继承来解决这一问题。

虚继承

目的:主要解决多继承中的菱形继承问题

class A
{
public:
    virtual void vfun(){}
};
class B:virtual public A
{
public:
    virtual void vfun1(){}
};//B包含两个虚表

虚继承特性:

  • 父类和子类在空间上一种倒置关系(与普通继承相比)
  • 当子类有特有的虚函数时,会有自己的虚表,就会有自己的虚指针
  • 子类存在指向虚基类(虚继承里面的基类)的虚基表,子类会有虚基表的指针vbptr,它指向这个虚基表,虚基表里面的内容是指向自己及虚基类的地址偏移量
  • 对于虚基类的初始化由最底层的派生类负责

虚继承解决菱形继承问题方案

1.先虚继承,再多继承 

2.先虚继承,再虚多继承 

重点掌握虚继承特性所占内存空间大小

#include<iostream>
using namespace std;

class Base
{
public:Base(int i) { cout << "B()" << " "; }
	  virtual void vfun() {}
	  int a;
};
class Base1:virtual public Base
{
public:Base1(int i): Base(i) { cout << "B1()" << " "; }
	  virtual void vfun1() {}
	  int b;
};
class Base2 :virtual public Base
{
public:Base2(int i) : Base(i) { cout << "B2()" << " "; }
	  virtual void vfun2() {}
	  int c;
};
//1.先虚继承,再多继承
class Derived1 :public Base1, public Base2
{
public:
	Derived1(int i) :Base1(i), Base2(i), Base(i) { cout << "D1()" << " "; }
	virtual void vfun3() {}
	int d;
};
//2.先虚继承,再虚多继承
class Derived2 :virtual public Base1, virtual public Base2
{
public:
	Derived2(int i) :Base1(i), Base2(i), Base(i) { cout << "D2()" << " "; }
	virtual void vfun4() {}
	int e;
};
int main()
{
	//测试所占内存大小
	Derived1 d1(1);
	cout << sizeof(d1) << endl;//B() B1() B2() D1() 36

	Derived2 d2(1);
	cout << sizeof(d2) << endl;//B() B1() B2() D2() 44

	return 0;
}

如有问题,欢迎交流指正!


http://www.kler.cn/news/350744.html

相关文章:

  • 纯血鸿蒙的最难时刻才开始
  • 在C及其他语言里运行shell命令的一点心得
  • 【记录】VSCode|自用设置项
  • Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
  • java和嵌入式现在哪个好?
  • Chrome谷歌浏览器加载ActiveX控件之JT2Go控件
  • 开通微信小程序需要哪些资料?集师知识付费小程序
  • ROS2 “通信方式” 参数服务器
  • 数据挖掘示例分析
  • 一个检查OpenEuler版本的Python脚本的意义与实现
  • windows安装cuda与cudnn
  • 基于车辆轨迹时空数据的城市热点预测模型研究
  • AI工具推荐合集
  • 用html做跨平台应用程序——千丝冥缘应用——跨平台软件开发
  • 【Next.js 项目实战系列】03-查看 Issue
  • AI学习指南深度学习篇- 预训练模型的原理
  • 大衍数列——考研408考试科目之数据算法——未来之窗学习通
  • React之组件渲染性能优化
  • python教程:python中的异常,异常堆栈及其案例
  • 【Mysql/xtrabackup】主从恢复(高端操作)
  • 第三课:python学习之安装pygame
  • 安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技
  • 如何使用Pillow库在背景图上添加文字的示例代码
  • 学习之高阶编程str方法
  • 路由器接交换机网速会变慢吗
  • JVM篇(Java内存区域与内存溢出异常(深入理解JVM第三版))(持续更新迭代)