Почему виртуальное наследование необходимо указывать в середине алмазной иерархии?

У меня есть ромбовидная иерархия классов:

    A
  /   \
 B     C
  \   /
    D

Чтобы избежать двух копий A в D, нам нужно использовать виртуальное наследование в B и C.

class A                     {  }; 
class B: virtual public A {};
class C: virtual public A   { }; 
class D: public B, public C { }; 

Вопрос: Почему виртуальное наследование необходимо быть выполнено в B и C, даже если неоднозначность в D? Было бы более интуитивно понятно, если бы это было в D.

Почему эта функция разработана таким образом комитетом по стандартам? класс A {}; class B: ...

У меня есть ромбовидная иерархия классов:

    A
  /   \
 B     C
  \   /
    D

Чтобы избежать двух копий A в D, нам нужно использовать виртуальное наследование в B и C.

class A                     {  }; 
class B: virtual public A {};
class C: virtual public A   { }; 
class D: public B, public C { }; 

Вопрос: Почему виртуальное наследование необходимо быть выполнено в B и C, даже если двусмысленность в D? Было бы более интуитивно понятно, если бы это было в D.

Почему эта функция разработана таким образом комитетом по стандартам? класс A {}; class B: ...

У меня есть ромбовидная иерархия классов:

    A
  /   \
 B     C
  \   /
    D

Чтобы избежать двух копий A в D, нам нужно использовать виртуальное наследование в B и C.

class A                     {  }; 
class B: virtual public A {};
class C: virtual public A   { }; 
class D: public B, public C { }; 

Вопрос: Почему виртуальное наследование необходимо быть выполнено в B и C, даже если двусмысленность в D? Было бы более интуитивно понятно, если бы это было в D.

Почему эта функция разработана таким образом комитетом по стандартам? Что мы можем сделать, если классы B и C поступают из сторонней библиотеки?

РЕДАКТИРОВАТЬ: Мой ответ заключался в том, чтобы указать классы B и C, что они не должны вызывать конструктор A всякий раз, когда создается его производный объект, поскольку он будет вызываться D.

11
задан templatetypedef 2 March 2011 в 10:50
поделиться