4

一个简单的 C++ 问题:是否可以根据指针的运行时类型调用一个函数或另一个函数?

例如,我有一个 A 类,B 类是 A 的孩子。

我想写一个函数 f 这样

f(A* a)
{//do something
}
f(B* b)
{//do something else
}

//call f()
A* a = new A();
A* b = new B();
f(a);//do something
f(b);//do something, but I'd like it to "do something else"

附加精度:A 和 B 是在我的代码中定义和实例化的,所以我不能在 A 和 B 上使用带有虚函数的常规多态性......

我知道你可以使用一些 RTTI,但有更优雅的解决方案吗?

4

4 回答 4

5

有了这些约束(不能修改类),并且不使用 RTTI,不。

您可以使用装饰器模式、包装AB在其他一些类中并将f它们作为参数,但这似乎有点过头了。

于 2012-08-21T12:34:06.547 回答
5

您可以使用以下方法实现dynamic_cast

f(A* a)
{
B* b = dynamic_cast<B*>(a);
if (b == nullptr)
//do something
else
//do something else
}
于 2012-08-21T12:39:02.570 回答
1

这与多态无关。f(A*)并且f(B*)不是相同的功能,它们只是碰巧具有相同的标识符。编译器将选择使用哪一个。如果没有某种 RTTI,您将无法在 C++ 中执行此操作。

于 2012-08-21T12:36:56.547 回答
0

如果我正确理解了您的问题,那么您正在寻找multimethods。尽管有一个由 Bjarne Stroustrup 编写的实验性扩展,但 C++ 不提供多方法作为语言特性。您可以使用访客模式作为解决方法。关于 C++ 中的多方法的一篇非常详细的文章:C++ 中的多方法:找到完整的解决方案

于 2012-08-21T12:51:10.653 回答