По моему мнению, VTable необходим для вызова самой производной версии функции. У него будут записи о самой производной версии функции ... Мое сомнение в том, почему нам нужен VTable для базового класса. Поскольку выполнение вызовов с базовым объектом всегда необходимо вызвать функции базового класса.C++, почему базовому классу нужен VTable
ответ
Поскольку R Shau не понравилось мое редактирование, я даю свой ответ высоко, основываясь на его.
VTable - это способ борьбы с полиморфизмом. Хотя VTable - это метод, широко используемый компиляторами C++, они могут предоставить любое другое решение.
Если базовый класс имеет одну или несколько функций-членов virtual
, конструктор базового класса присваивает VTable объекту.
Конструктор базового класса не имеет никакого способа узнать, является ли объект реального объекта объектом базового класса или производным объектом класса, поэтому базовый объект должен содержать указатель, указывающий на допустимый VTable.
Пример:
struct Base
{
Base() {}
virtual void m() {}
virtual ~Base() {}
};
struct Derived : public Base
{
Derived() : Base() {}
void m() {}
~Derived() {}
};
void foo()
{
Base b;
Derived d;
Base * bPtr;
}
bPtr
может указывать на Base
bPtr = & b;
bPtr->m();
или Derived
bPtr = & d;
bPtr->m();
Поскольку bPtr
имеет тип Base *
, как выполнить вызов полиморфного bPtr->m()
, что должно привести к вызову Base::m()
, если bPtr
указывает на b
и Derived::m()
, если bPtr
указывает на d
? Ответ: найдите адрес m()
метода в VTable.
Что происходит при решении bPtr->m()
что-то вроде этого:
bPtr pointing to Base object
bPtr-> vtable_pointer -> VTable of Base -> m() -> points to address of Base::m()
bPtr pointing to Derived object
bPtr-> vtable_pointer -> VTable of Derived -> m() -> points to address of Derived::m()
Таким образом, без виртуальных таблиц в базовом классе, полиморфные вызовы не могут быть выполнены, так как во время выполнения не известен, если объект указываемого bPtr
действительно объект базового класса или объект производного класса.
Твердое объяснение .. Спасибо – senjes
Если базовый класс имеет одну или несколько функций-членов virtual
, конструктор базового класса присваивает VTable объекту.
Конструктор базового класса не имеет способа узнать, является ли объект реального объекта базовым классом или объектом производного класса.
Пример:
struct Base
{
Base() {}
virtual ~Base() {}
};
struct Derived : public Base
{
Derived() : Base() {}
~Derived() {}
};
void foo()
{
Base b;
Derived d;
}
Base::Base()
вызывается непосредственно в строке
Base b;
Она вызывается косвенно, через Derived::Derived()
в линии
Derived d;
Как реализация Base
знать, Base::Base()
вызывается непосредственно для Base
или косвенно для Derived
? Без этого знания он должен убедиться, что это поведение работает для обоих из них - это означает, что для них есть VTable.
- 1. C++ - присвоение производному классу базовому классу
- 2. C++ autoconvert унаследованный класс к базовому классу
- 3. C++ интерфейс подключения к базовому классу
- 4. Objective-C Вопрос по базовому классу
- 5. С ++: Привязка к базовому классу
- 6. Кастинг smartpointers к базовому классу
- 7. Копирование наследует значение базовому классу
- 8. безупречная пересылка по базовому классу
- 9. Как назначить дочерний класс базовому классу?
- 10. Как создать конструктор, доступный только базовому классу?
- 11. C++ Унаследованные классы шаблонов не имеют доступа к базовому классу
- 12. Хороший способ инициализации классов шаблонов базовому классу
- 13. Python передает постоянные аргументы базовому классу
- 14. Доступ к базовому классу C# в итераторе вызывает предупреждение ReSharper
- 15. Как получить доступ к базовому классу из производного класса C#
- 16. Как удалить указатель, назначенный базовому классу?
- 17. Передача интерфейса базовому классу по ссылке
- 18. методы из унаследованного класса, переданные базовому классу
- 19. Листинг объекта к базовому или производному классу?
- 20. Выводить конструктор только базовому классу, возможно?
- 21. Попутный свойства от класса к базовому классу
- 22. приведения к абстрактному родовому базовому классу
- 23. Назначение класса базовому классу, как это сделать?
- 24. Дискриминатор по базовому классу по первому коду
- 25. Назначить производный класс unique_ptr базовому классу unique_ptr
- 26. Как условно передать конструктор базовому классу?
- 27. Glvalue относится к базовому классу подобъектом
- 28. Разрешить другому базовому классу реализовать виртуальную функцию
- 29. Вариант типа: Почему vtable?
- 30. Ошибка Flex C++ VTable
Vtable - это деталь реализации; какую реализацию вы используете? (GCC, Microsoft, Clang и т. Д.) И почему вы говорите, что базовому классу нужен один? –
Возможно, вы захотите уточнить, означает ли вы речь о базовом классе, который участвует и определяет виртуальные элементы для полиморфной иерархии. – WhozCraig