Предположим, у вас есть этот класс:
class X {
public:
virtual void myfunc();
};
При вызове виртуальной функции для простого объекта типа X, компилятор будет генерировать прямой вызов, т.е. обращаться непосредственно к X::myfunct()
:
X a; // object of known type
a.myfunc(); // will call X::myfunc() directly
Если вы вызовете виртуальную функцию с помощью разыменования указателя или ссылки, неясно, какой тип будет иметь указанный объект. Это может быть X, но это также может быть типа, полученный из X. Тогда компилятор сделает виртуальный вызов, т.е. использовать таблицу указателей на функции адресу:
X *pa; // pointer to a polymorphic object
... // initialise the pointer to point to an X or a derived class from X
pa->myfunc(); // will call the myfunc() that is related to the real type of object pointed to
Вот вам online simulation кода , Вы увидите, что в первом случае сгенерированная сборка вызывает адрес функции, тогда как во втором случае компилятор загружает что-то в регистр и совершает косвенный вызов с использованием этого регистра (т. Е. Вызываемый адрес не является «сложным» -wired "и будет определяться динамически во время выполнения).
Не могли бы вы указать, где вы читаете о * direct *. Я впервые услышал об этом. – xvan
https://msdn.microsoft.com/en-us/library/bw1hbe6y.aspx О правилах встраивания компилятора. – antiHUMAN
Возможный дубликат [Что такое различие между вызовом виртуального метода и вызовом Direct Method в контексте VTable?] (Http://stackoverflow.com/questions/12041614/what-is-difference-between-virtual-method-call-and -direct-method-call-in-context) – xvan