不存在多态性

Uninvasive polymorphism

本文关键字:多态性 不存在      更新时间:2023-10-16

一个简单的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,但有更优雅的解决方案吗?

您可以使用dynamic_cast:实现这一点

f(A* a)
{
B* b = dynamic_cast<B*>(a);
if (b == nullptr)
//do something
else
//do something else
}

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

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

这与多态性无关。f(A*)f(B*)不是同一个函数,它们只是碰巧有相同的标识符。编译器将选择使用哪一个。如果没有某种RTTI,你就无法在C++中做到这一点。

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