Механизмы вызова виртуальных функций разрешаются во время выполнения.Потому что в C ++ указатель на производный класс совместим по типу с указателем на его базовый класс.Таким образом, для вызова виртуальной функции должен быть известен фактический тип созданного объекта (или фактический нижележащий объект), на который указывает указатель базового класса, который может быть разрешен только во время выполнения.
struct foo
{
virtual void virtualMethod()
{
cout<< " \n virtualMethod of foo \n";
}
void normalMethod()
{
cout<< " \n normalMethod of foo \n";
}
virtual ~foo() {}
};
struct bar: public foo
{
void virtualMethod()
{
cout<< " \n virtualMethod of bar \n";
}
void normalMethod()
{
cout<< " \n normalMethod of bar \n";
}
~bar() {}
};
foo* obj = new bar ;
obj->virtualMethod() ;
Теперь, то, какой virtualMethod()
должен быть вызван, зависит от типа времени выполнения (или фактического нижележащего объекта), на который указывает obj
, потому что obj
может указывать на объект, сконструированный либо new foo
, либо new bar
.Во время выполнения мы знаем, что obj
создается из возражаемого, чей возвращаемый тип равен bar*
, соответствующая виртуальная функция производного класса вызывается, если существует.В противном случае вызывается виртуальная функция базового класса.
obj->normalMethod();
Этот метод может быть разрешен во время самой компиляции, поскольку это обычная функция-член.
Results: ideOne link link