Ковариантные виды возврата и отправки

Я смущен этой простой программой:

#include <iostream>

using namespace std;

struct Base {
virtual ~Base() {}
virtual Base* concrete() { cout << "concrete returning base - "; return this;}
void stat() { cout << "I'm a BASE\n";}
};

struct Derived: Base {
Derived* concrete() override { cout << "concrete returning derived - "; return this;}
void stat() { cout << "I'm a DERIVED\n";}
};int main() {
Base * bd = new Derived;
bd->stat();  // prints: "I'm a BASE"bd->concrete()->stat(); //prints: "concrete returning derived - I'm a BASE"
delete bd;
return 0;
}

Почему не печатается последняя строка concrete returning derived - I'm a DERIVED? Что тут происходит?

3

Решение

Вы неправильно понимаете полезность ковариантного типа возвращаемого значения … оно срабатывает, когда вызывающий контекст знает, что имеет дело с Derivedтип объекта:

Derived d;
d->concrete()->stat();

В твоем случае, concrete называется на Base* поэтому, хотя он отправляется полиморфно и возвращает Derived*этот указатель рассматривается как Base* в контексте вызова, и это Base* статический тип, который определяет статическую отправку stat(),

4

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