zoukankan      html  css  js  c++  java
  • 97、什么是虚拟继承

    由于C++支持多继承,除了public、protected和private三种继承方式外,还支持虚拟(virtual)继承, 举个例子:

    #include <iostream>
    using namespace std;
    class A{}
    class B : virtual public A{};
    class C : virtual public A{};
    class D : public B, public C{};
    int main()
    {
    cout << "sizeof(A):" << sizeof A <<endl; // 1,空对象,只有一个占位
    cout << "sizeof(B):" << sizeof B <<endl; // 4,一个bptr指针,省去占位,不需
    要对齐
    cout << "sizeof(C):" << sizeof C <<endl; // 4,一个bptr指针,省去占位,不需
    要对齐
    cout << "sizeof(D):" << sizeof D <<endl; // 8,两个bptr,省去占位,不需要对

    }

    上述代码所体现的关系是,B和C虚拟继承A,D又公有继承B和C,
    这种方式是一种菱形继承或者钻石继承,可以用如下图来表示

    虚拟继承的情况下,无论基类被继承多少次,只会存在一个实体。虚拟继承基类的子类中,子类会增加某种形式的指针,或者指向虚基类子对象,或者指向一个相关的表格;表格中存放的不是虚基类子对象的地址,就是其偏移量,此类指针被称为bptr,如上图所示。如果既存在vptr又存在bptr,某些编译器会将其优化,合并为一个指针。

  • 相关阅读:
    P3970 [TJOI2014]上升子序列
    受欢迎的牛(Tarjan缩点模板)
    Y15BeTa的乱搞方法(占坑待填)
    Luogu P4145 上帝造题的七分钟2 / 花神游历各国
    Luogu P1525 【关押罪犯】
    Luogu P1077 摆花 NOIP2012pjT3
    Nowcoder deco的abs
    CSP-S前的芝士清单
    普天同庆
    线段树区改区查标记永久化板子
  • 原文地址:https://www.cnblogs.com/crbhf/p/14995423.html
Copyright © 2011-2022 走看看