C ++协变返回类型应用程序

时间:2015-04-20 09:54:28

标签: c++ design-patterns covariance covariant

我想询问协变返回类型和可能的(非)应用程序。我以为我发现了一些新的设计模式,但遗憾的是它不起作用:(

让我们从一个例子开始:

// 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:我尽量避免切换:)

1 个答案:

答案 0 :(得分:0)

函数重载解析在编译时完成,取决于表达式的静态类型而不是动态表达式。

b->getSelf()的类型是B*,因为在getSelf类型的实例上调用时,它是成员函数B的返回类型。 此时b在运行时指向BCD无关紧要,无论您在该指针中存储的子实例如何“ t影响其静态类型。

那就是说,你想要实现的目标似乎可以通过简单的多态性(使compute成为成员函数)来解决,或者如果你不希望你可以使用double dispatching

相关问题