Функция run1
является виртуальной функцией, в то время как функция run2
не является виртуальной функцией.
Виртуальные функции вызываются в соответствии с типом динамического c используемого указателя, в то время как не являются виртуальными. Функции вызываются в соответствии с типом используемого указателя stati c.
Тип указателя * stati c pb
равен B *
.
B b, *pb;
После этого присваивание
pb = &b;
тип указателя динамического c также B *
. Поэтому вызывается виртуальная функция, определенная в классе B
.
После этого присваивания
pb = &d;
тип указателя динамического c pb
изменен с B *
на D *
.
Таким образом, в этом операторе
pb->run1(); //Derived (why ?)
вызывается виртуальная функция в соответствии с типом указателя динамического c. В то время как в этом операторе
pb->run2(); //Base (why ?)
вызывается не виртуальная функция в соответствии с типом указателя stati c.
Это указатель на таблицу указателей виртуальных функций ищется в объекте, на который указывает используемый указатель.
Эта функция определяет поведение полиморфа c.