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).
Таким образом, вся разница в ваших намерениях и действительно удобочитаемости кода.