У меня есть следующий код:
#include <iostream>
using namespace std;
class Parent {
public:
virtual void f() { cout << "Parent" << endl; }
};
class Child : public Parent {
public:
void f() { cout << "Child" << endl; }
};
void t1(Parent * p) { p->f(); }
void t2(Parent & p) { p.f(); }
int main() {
Child a;
t1(&a);
t2(a);
return 0;
}
Я проверил это как в Visual Studio 2013 и ideone.com, и оба получили результат:
Child
Child
я могу понять t1
призвание Child::f()
в результате динамического связывания, но второе меня озадачило — я ожидал Parent &
«исправить» тип, так t2
назвал бы Parent::f()
, Я неправильно понимаю правила? Как можно объяснить это поведение?
Это то, что делает полиморфизм.
Я ожидал
Parent &
«исправить» тип, такt2
назвал быParent::f()
,
Ну, вы ожидали, что неправильно.
Я неправильно понимаю правила?
Да.
Как можно объяснить это поведение?
Собирая книгу на C ++ и читая главу о полиморфизме.
Ваш Parent&
работает так же, как Parent*
будет: позволяя виртуальная отправка.
Важно отметить, что указатели (и ссылки) не вызывают полиморфизм. Поэтому везде, где вы читаете, только указатели вызывают полиморфизм, было вдвойне неправильно. Полиморфизм вызывается доступом к объекту. Так уж получилось, что из-за проблема нарезки, невозможно вызвать виртуальную рассылку Кроме через указатель или ссылку.