我遇到过这个让我困惑的问题。复杂的构建顺序 - 涉及虚拟继承
这个代码是:
struct B1 { B1(){std::cout << "B1\n";} };
struct V1 : public B1 { V1(){std::cout << "V1\n";} };
struct D1 : virtual public V1 {D1(){std::cout << "D1\n";} };
struct B2 {B2(){std::cout << "B2\n";} };
struct B3 {B3(){std::cout << "B3\n";} };
struct V2 : public B1, public B2 {V2(){std::cout << "V2\n";} };
struct D2 : public B3, virtual public V2 {D2(){std::cout << "D2\n";} };
struct X : public D1, public D2 { };
问:什么是建筑X的顺序?
这里是我与简化IT
首先,我想回答这个事实,认为没有虚继承这个问题的目的是构建一个图。关键字virtual
被public
代替我会得到
B1,V1,D1, [B3,B1,B2,V2,D2] , X
但是我不知道,当虚拟继承走来我会如何处理这个问题。它提到的代码。我读到它的解决方法完全一样,但virtual bases优先。这里有哪些虚拟基地?有关如何解决这个问题的任何建议?
该图不正确,两个'B1'实例是分开的。 – 2014-09-24 05:58:14
我不确定如果'V1'是'虚拟公共B1'但是'V2'是(非虚拟)'public B1',会发生什么情况! – 2014-09-24 05:59:46
@MattMcNabb虚拟的虚拟构建器实际上由'X'的构造器构造,非虚拟构造器通过V2的构造器非虚拟构造;你最终得到两个'B1'子对象。 – 2014-09-24 06:55:34