我想询问协变返回类型和可能的(非)应用程序。我以为我发现了一些新的设计模式,但遗憾的是它不起作用:(
让我们从一个例子开始:
// 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我为糟糕的格式化道歉
编辑:当然,如果我在main中使用强制转换,它会正确调用compute(D *)。
编辑#2:我尽量避免切换:)
答案 0 :(得分:0)
函数重载解析在编译时完成,取决于表达式的静态类型而不是动态表达式。
b->getSelf()
的类型是B*
,因为在getSelf
类型的实例上调用时,它是成员函数B
的返回类型。
此时b
在运行时指向B
,C
或D
无关紧要,无论您在该指针中存储的子实例如何“ t影响其静态类型。
那就是说,你想要实现的目标似乎可以通过简单的多态性(使compute
成为成员函数)来解决,或者如果你不希望你可以使用double dispatching。