вызов виртуальной функции через ссылку: вызывается переопределение производного класса

У меня есть следующий код:

#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(), Я неправильно понимаю правила? Как можно объяснить это поведение?

1

Решение

Это то, что делает полиморфизм.


Я ожидал Parent & «исправить» тип, так t2 назвал бы Parent::f(),

Ну, вы ожидали, что неправильно.

Я неправильно понимаю правила?

Да.

Как можно объяснить это поведение?

Собирая книгу на C ++ и читая главу о полиморфизме.
Ваш Parent& работает так же, как Parent* будет: позволяя виртуальная отправка.

Важно отметить, что указатели (и ссылки) не вызывают полиморфизм. Поэтому везде, где вы читаете, только указатели вызывают полиморфизм, было вдвойне неправильно. Полиморфизм вызывается доступом к объекту. Так уж получилось, что из-за проблема нарезки, невозможно вызвать виртуальную рассылку Кроме через указатель или ссылку.

3

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector