C++ виртуальная разница наследования

Дано два класса с общим виртуальным базовым классом:

class Base {};

class Derived1 : public virtual Base {};

class Derived2 : public virtual Base {};

Есть ли разница между этими двумя производными классами?:

  • class Derived3 : public virtual  Base, public Derived1, public Derived2 {};
    
  • class Derived3 : public Derived1, public Derived2 {};
    

Первый также получен непосредственно из виртуального базового класса, но я думаю, что это не имеет никакого эффекта, потому что он используется совместно с Derived1 а также Derived2,

3 ответа

Решение

Они говорят то же самое. Разница лишь в том, что если вы удалили public Derived1 а также public Derived2 из обоих определений Derived3первый все равно будет наследовать от Base а второй не будет.

РЕДАКТИРОВАТЬ: Я не думал тщательно о том, есть ли какая-то странная ситуация перекрестного броска, где эти два также вели бы себя по-разному, хотя я не думаю, что есть.

Между этими примерами нет разницы.

Но в более сложном сценарии непосредственное наследование унаследованной виртуальной базы может изменить порядок построения / уничтожения подобъектов базового класса.

Я не думаю, что есть какая-то разница в макете объекта, потому что цель виртуального наследования состоит в том, чтобы избежать двух копий Base (или три экземпляра в случае 1).

Таким образом, вся разница в ваших намерениях и действительно удобочитаемости кода.

Другие вопросы по тегам