钻石继承,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 gcc
和 MSVC
),它是按照我下面描述的方式实现的.
当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(){}
};
因此我们有了经典的菱形问题和 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 gcc
和 MSVC
),它是按照我下面描述的方式实现的.
当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(){}
};