При использовании виртуального базового класса в сценарии множественного наследования необходимо ли всем производным классам ссылаться на виртуальную базу?

Стандарт кодирования JSF C ++ ВВС США требует, чтобы виртуальный базовый класс был объявлен для каждого производного класса, который обращается к виртуальной базе.

Например, в следующей иерархии:

  A
/ \
B1  B2
C1  C2
\ /
D

… правило, которое они накладывают в этом стандарте (правило AV 88.1, для справки), требует, чтобы классы были объявлены следующим образом:

class A;
class B1 : virtual A;
class B2 : virtual A;
class C1 : B1, virtual A;
class C2 : B2, virtual A;
class D  : C1, C2, virtual A;

Мои вопросы следующие:

  1. Является ли это семантически отличным от только виртуального наследования в объявлении @ B1 / B2 и без указания virtual A при каждом последующем объявлении класса?
  2. Если это семантически отличается, почему кто-то / хочет / оставить это? Мне кажется глупым, что вам абсолютно необходимо делать это на каждом уровне наследования, поскольку это добавляет потенциальную точку отказа.

0

Решение

Это семантически идентично, так как каждый производный класс будет иметь точно один виртуальная база типа A, Явное упоминание виртуальной базы довольно неплохо, потому что самый производный класс создает виртуальную базу (в отличие от того, что происходит с не виртуальными базами), и порядок построения важно помнить при написании конструкторов производных классов.

У меня нет технического ответа для (2). Вам не нужно это делать, но было бы неплохо, если бы вы это сделали. Как будто звоню своим родителям, я полагаю. Как и во многих вещах, C ++ не заставляет вас быть разумным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]