创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容💖:
专栏:c语言之路重点知识整合
一、什么是菱形继承
菱形继承是一种多重继承的特殊情况。当一个类从两个或多个基类派生,而这些基类又有共同的基类时,就形成了菱形继承结构。
class Base
{
public:
int value;
void fun();
};
class Derived1 : public Base
{
};
class Derived2 : public Base
{
};
class Derived3 : public Derived1, public Derived2
{
};
Derived3
类通过Derived1
和Derived2
间接继承了Base
类
二、菱形继承带来的问题
数据冗余和二义性
- 由于
Derived3
继承了Derived1
和Derived2
,而它们又都继承自Base
,这可能导致Derived3
中存在两份Base
类的数据成员 - 当访问
Base
类中的成员时,会产生二义性。例如,如果在Derived3
中访问 value 成员,编译器无法确定应该使用从Derived1
继承的 value 还是从Derived2
继承的 value
三、解决菱形继承问题的方法——虚继承
为了解决菱形继承带来的问题,C++引入了虚继承的概念。虚继承使得在多重继承中,公共基类在派生类中只存在一份实例
使用虚继承:
class Base
{
public:
int value;
void fun();
};
class Derived1 : virtual public Base
{
};
class Derived2 : virtual public Base
{
};
class Derived3 : public Derived1, public Derived2
{
};
Derived1
和Derived2
都以虚继承的方式继承自Base
Derived3
中只会有一份Base
类的实例,避免了数据冗余和二义性问题。
四、虚继承的原理和实现机制
虚继承通过在派生类的对象布局中插入一个指向虚基类表的指针来实现
虚基类表中存储了虚基类在对象中的偏移量等信息,使得在访问虚基类成员时能够正确地定位到唯一的实例。
当使用虚继承时,编译器会在派生类的构造函数中初始化虚基类
这确保了虚基类的构造函数只被调用一次,无论继承层次有多深。
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |