0

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

让我们从一个例子开始:

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

4

1 回答 1

0

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

的类型b->getSelf()是因为这是在 type的实例上调用时B*成员函数的返回类型。此时在运行时指向 a 、 a或 a并不重要,您存储在该指针中的任何子实例都不会影响其静态类型。getSelfBbBCD

也就是说,您尝试实现的目标似乎可以通过简单的多态性(创建compute一个成员函数)来解决,或者如果您不希望这样做,您可以使用double dispatching

于 2015-04-20T10:54:25.310 回答