C ++ полиморфизм: почему статическое связывание невозможно, даже когда тип очевиден

Я изучаю виртуальные функции и виртуальные таблицы в 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;
}

2

Решение

почему нельзя скомпилировать рисунок, что это вызов функции для производной функции foo во время самой компиляции?

Оно может. И некоторые компиляторы будут преобразовать этот вызов в статическую привязку.

И есть другие сценарии, когда компилятор должен использовать динамическое связывание.

Который foo() должен вызываться в этой функции?

void function( Base* p )
{
p->foo();
}

Это не может быть определено *. Динамическое связывание должно быть использовано.

* Изменить: на основе информации, которую я дал. 🙂

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]