钻石继承,C++ 处理

Diamond inheritance, c++ handling

因此我们有了经典的菱形问题和 int 的解决方案:

class A
{
public:
    A()
    {
        std::cout << "A c'tor" << std::endl;
    }
    void f()
    {
        std::cout << "A::f()" << std::endl;
    }
};

class B :virtual public A{};

class C :virtual public A{};

class D : public B, public C{};

编译器如何处理这个问题,所以它只创建一个 A 实例? 请尽可能具体地回答。

标准没有指定 如何 编译器应该处理它,但通常(AFAIK gccMSVC),它是按照我下面描述的方式实现的.

当class正常继承时,它将包含所有基础class成员

当 class 继承 虚拟 时,它将(而不是整个 class)包含指向基 class 所在位置的指针,虚拟基础 class 应驻留在大多数派生对象中:

struct A
{
   int i;
};

struct B: virtual A{};

struct C: B{};



int someFunction()
{
    /* b internally contains pointer that points to it's (virtual)base class , 
    in this case B itself is most derived object so it points to base class
    which is stored somewhere inside B */

    B b;


    /* now subobject B (which is stored inside C) contains pointer that
      ,again points to it's (virtual) base class 
      ,but that class now resides in most derived object which is C */

    C c;
}

加分:

你能找出错误在哪里吗?

struct A
{
    std::string message;

    A(std::string parameter): message(parameter) {}

};

struct B: virtual A
{
    B(std::string parameter): A(parameter) {}
};

struct C: B
{
    C(){}
};