Я знаю, что компилятор дает ошибку для двусмысленности, если мы не упоминаем виртуальное ключевое слово при выводе дочернего класса в проблему с алмазом. Итак, как виртуальное ключевое слово устраняет эту двусмысленность?Как виртуальное ключевое слово разрешает двусмысленность в множественном наследовании?
ответ
От isocpp faq
class Base {
public:
// ...
protected:
int data_;
};
class Der1 : public virtual Base {
↑↑↑↑↑↑↑ // This is the key
public:
// ...
};
class Der2 : public virtual Base {
↑↑↑↑↑↑↑ // This is the key
public:
// ...
};
class Join : public Der1, public Der2 {
public:
void method()
{
data_ = 1; // Good: this is now unambiguous
}
};
int main()
{
Join* j = new Join();
Base* b = j; // Good: this is now unambiguous
}
, если вы не указали наследование как виртуальный, компилятор попытается добавить два Base
классов в Derived
объекта, и он не будет знать, какие data_
заполнить . У вас будет фактически два объекта, которые будут одинаковыми в вашем производном классе. Объявление наследования как virtual
сообщает компилятору, что вы хотите получить только один экземпляр базового класса в производном классе.
Спасибо dau_sama. В этом случае размер класса Join равен 12, которые включают в себя 2 виртуальных указателя Der1, Der2 и 4 байта данных (я думаю). Правильно ли это? Также какой путь используется компилятором для поддержки одиночной копии базового объекта? – DevMJ
Я думаю, что это правильно в gcc/x86, но это реализация определена. Вероятно, на других архитектурах это может быть реализовано по-другому. В этом простом случае компилятор просто знает, что он должен только зарезервировать один экземпляр базового объекта в макете памяти. –
- 1. виртуальное ключевое слово внутри
- 2. Виртуальное ключевое слово, кажется, игнорируется
- 3. Что делает виртуальное ключевое слово в ActionScript?
- 4. Показать виртуальное ключевое слово asp.net для пароля
- 5. расположение памяти в множественном наследовании
- 6. равенство указателя в множественном наследовании
- 7. Внедрение Vtable в множественном наследовании
- 8. бесполезный супер в множественном наследовании?
- 9. избежать алмазов в множественном наследовании
- 10. Смещение типа в множественном наследовании
- 11. Как использовать namedtuples в множественном наследовании
- 12. Как ссылки разрешают неоднозначность в множественном наследовании?
- 13. Вопрос о множественном наследовании C++
- 14. Разница в VTBL в одиночном наследовании и множественном наследовании
- 15. C++ Виртуальное ключевое слово как способ избежать включения единиц кода
- 16. Как вызвать __init__ при множественном наследовании?
- 17. Сомнения в множественном наследовании в .net
- 18. Разрешение метода при множественном наследовании в Python
- 19. Где «виртуальное» ключевое слово необходимо в сложной иерархии множественного наследования?
- 20. Какой экземпляр будет вызываться в множественном наследовании?
- 21. Последовательность вызовов конструктора в множественном наследовании
- 22. Как это ключевое слово разрешает в вызове функции
- 23. Python: проверьте порядок классов в множественном наследовании
- 24. Нет соответствующей функции в множественном наследовании
- 25. C# vs Java - зачем нужно виртуальное ключевое слово?
- 26. удалить виртуальное ключевое слово из привязки xamarin java
- 27. Что означает виртуальное ключевое слово при переопределении метода?
- 28. Python. Я получаю ошибку при множественном наследовании
- 29. Получить ошибки при множественном наследовании C++
- 30. Размер объектов при многоуровневом/множественном наследовании
Видимый дубликат: [Как виртуальное наследование разрешает двусмысленность «бриллианта» (множественное наследование)?] (Http://stackoverflow.com/q/2659116/1149924) – kkm