шаблоны проектирования — C ++ ковариантное приложение возвращаемого типа

Я хотел спросить о ковариантном типе возврата и возможном (не) приложении. Я думал, что открыл какой-то новый шаблон дизайна, но, к сожалению, он не работает 🙁

Давайте начнем с примера:

// test.h
class B {public: virtual B* getSelf() {return this;} };
class D : public B { public: D* getSelf() {return static_cast<D*>(this);} };

void compute(B* something);
void compute(D* something);

// test.cpp
int main()
{
B* b = new D();
compute(b->getSelf()); // This calls compute(B*), not compute(D*)
}

Есть идеи, почему это не работает?

PS прошу прощения за плохое форматирование

Изменить: Конечно, он правильно вызывает Compute (D *), если я использую приведение в основной.

Редактировать # 2: я пытаюсь избежать переключения столько, сколько я могу 🙂

0

Решение

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

Тип b->getSelf()является B*так как это тип возврата функции-члена getSelf при вызове экземпляра типа B,
В это время не имеет значения, что b будет указывать на B, C или D во время выполнения любой дочерний экземпляр, который вы храните в этом указателе, не влияет на его статический тип.

Тем не менее, то, что вы пытаетесь достичь, кажется, решаемо с помощью простого полиморфизма (сделать compute функция-член) или если вы не хотите, что вы можете использовать двойная диспетчеризация.

0

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