In the line Base* bp = &d2, the object type is known at compile time. Then the decision of which function to use in the case of bp->vf(); can also be made at compile time right?
Нет, решение о том, какую функцию использовать, принимается динамически во время выполнения в зависимости от типа объекта, а не от типа указателя / ссылки на этот объект.Это называется динамическим связыванием.Компилятор хранит скрытый указатель с именем virtual pointer
или vptr
, который указывает на таблицу, называемую виртуальной таблицей.В каждом классе будет одна виртуальная таблица, по крайней мере, одна виртуальная функция (независимо от того, сколько объектов создано для класса).Виртуальная таблица содержит адрес виртуальной функции класса.
Since the object type is known at compile time itself, is the power of virtual functions used in this sample program?
Фактически указанный объект может быть неизвестен во время компиляции.Возьмем пример метода, который принимает указатель базового класса в качестве параметра, как показано ниже:
void draw(Shape *bp)
{
bp->draw();
}
В этом случае фактическим объектом может быть любая форма, полученная из Shape
.Но нарисованная форма зависит от фактического типа переданного объекта.