Я изучаю виртуальные функции и виртуальные таблицы в C ++. Но я не мог понять, почему существует необходимость в динамическом связывании. Разве у компилятора нет всей информации, чтобы выяснить, является ли вызов функции производной или базовой функцией, например, здесь:
class Base1 {
public : virtual void foo()
{ cout << " Base foo \n"; }
};
class Base2 {
public : virtual void foo()
{ cout << " Base2 foo \n"; }
};
class derived : public base1, base 2 {
public : virtual void foo()
{ cout << " derived foo \n"; }
}
int main()
{
derived d;
Base2 *p = &d;
p->foo(); // why can't the compiler figure out that this
// is a function call to the derived function
// foo at compile time?
return 0;
}
почему нельзя скомпилировать рисунок, что это вызов функции для производной функции foo во время самой компиляции?
Оно может. И некоторые компиляторы будут преобразовать этот вызов в статическую привязку.
И есть другие сценарии, когда компилятор должен использовать динамическое связывание.
Который foo()
должен вызываться в этой функции?
void function( Base* p )
{
p->foo();
}
Это не может быть определено *. Динамическое связывание должно быть использовано.
* Изменить: на основе информации, которую я дал. 🙂
Других решений пока нет …