网站更换域名多少钱,注册查询官方网站,网站的开发语言有哪些,技术外包食用指南#xff1a;本文在有C基础的情况下食用更佳 #x1f340;本文前置知识#xff1a;C虚函数#xff08;很重要#xff0c;内部剖析#xff09; ♈️今日夜电波#xff1a;僕らのつづき—柊優花 1:06 ━━━━━━️#x1f49f;──────── 3:51 … 食用指南本文在有C基础的情况下食用更佳 本文前置知识C虚函数很重要内部剖析 ♈️今日夜电波僕らのつづき—柊優花 1:06 ━━━━━━️──────── 3:51 ◀️ ⏸ ▶️ ☰ 关注点赞收藏您的每一次鼓励都是对我莫大的支持 目录
一、虚继承的引入—菱形继承 什么是菱形继承 内层结构 二、什么是虚继承 语法定义 内层结构 三、使用虚继承的原因 四、使用虚继承需注意 一、虚继承的引入—菱形继承 什么是菱形继承 菱形继承是指在继承关系中存在一个派生类同时继承自两个或多个基类而这些基类又共同继承自同一个基类。这样就会导致派生类中存在多个相同的基类子对象从而造成资源浪费和二义性问题。 class Animal{public:int data;};class Sheep :public Animal{public:};class Tuo :public Animal{public:};class SheepTuo :public Sheep, public Tuo{public:};int main(int argc, char* argv[]){SheepTuo st;//SheepTuo 从Sheep中继承data 从Tuo继承data 就产生二义性//st.data 200;//err//第一种方式加作用域解决st.Sheep::data 200;st.Tuo::data 300;return 0;} 内层结构 这段代码的内层结构如下 这就是典型的菱形继承的例子SheepTuo 从Sheep中继承data 从Tuo继承data 就产生二义性。但是我们可以采用加作用域的方式解决问题。 那有没有更加优的解决办法呢答案是虚继承 二、什么是虚继承 本文为虚函数后的知识 强烈建议各位先去了解一下此文 本文前置知识C虚函数很重要内部剖析 在多继承中如果一个派生类从两个或多个基类继承而这些基类又共同继承自同一个基类那么就会出现菱形继承问题。这种情况下派生类将会有两份相同的基类成员导致二义性和冗余。 虚继承通过在派生类对共同基类的继承前加上关键字virtual来解决这个问题。使用虚继承后共同基类的成员只会在派生类中存在一份从而避免了二义性和冗余。 通过使用虚继承可以确保多继承中的共同基类只会在派生类中存在一份从而解决菱形继承问题。 语法定义
class Base {};class Derived : virtual public Base {}; class Animal{public:int data;};class Sheep :virtual public Animal{public:};class Tuo :virtual public Animal{public:};class SheepTuo :public Sheep, public Tuo{public:};int main(int argc, char* argv[]){SheepTuo st;//在加入virtual后二义性以及冗余得以解决st.data 200;return 0;} 内层结构 这段代码的内层结构如下 Animal未变因为改变的不是他 Sheep产生了虚基指针和虚基表 Tuo同样也产生了虚基指针和虚基表 SheepTuo保存了两个父类的虚基指针 三、使用虚继承的原因 敏锐的你可能已经发现了每当使用了virtual以使用虚继承后相对于没有使用虚继承的子类他们的的内存都加了4字节的vptr指针而最后的最后的那个子类则是多出了两个4字节的vptr指针很明显通过内层结构图我们得知这两个指针分别指向这个子类的两个父类的虚基表vftable。之所以 产生 vbptr和vbtable目的 是为了保证 不管多少个继承 虚基类的数据只有一份。 一图让你明白~ 四、使用虚继承需注意 虚继承只有在多继承时才有用。虚继承只能解决具备公共祖先的多继承所带来的二义性问题不能解决没有公共祖先的多继承的。单继承以及只有一层的继承都是不行的。 虚继承不管继承多少次 虚基类 只有一份。 感谢你耐心的看到这里ღ( ´ᴗ )比心如有哪里有错误请踢一脚作者o(╥﹏╥)o 给个三连再走嘛~