Я хотел спросить о ковариантном типе возврата и возможном (не) приложении. Я думал, что открыл какой-то новый шаблон дизайна, но, к сожалению, он не работает 🙁
Давайте начнем с примера:
// 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: я пытаюсь избежать переключения столько, сколько я могу 🙂
Разрешение перегрузки функций выполняется во время компиляции и зависит от статического типа вашего выражения, а не от динамического.
Тип b->getSelf()
является B*
так как это тип возврата функции-члена getSelf
при вызове экземпляра типа B
,
В это время не имеет значения, что b
будет указывать на B
, C
или D
во время выполнения любой дочерний экземпляр, который вы храните в этом указателе, не влияет на его статический тип.
Тем не менее, то, что вы пытаетесь достичь, кажется, решаемо с помощью простого полиморфизма (сделать compute
функция-член) или если вы не хотите, что вы можете использовать двойная диспетчеризация.