不存在多态性
Uninvasive polymorphism
一个简单的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模式,将A
和B
封装在其他一些类中,并使f
将它们作为参数,但这似乎有些过头了。
这与多态性无关。f(A*)
和f(B*)
不是同一个函数,它们只是碰巧有相同的标识符。编译器将选择使用哪一个。如果没有某种RTTI,你就无法在C++中做到这一点。
如果我正确理解你的问题,那么你正在寻找多种方法。C++没有提供多方法作为语言特性,尽管有一个实验扩展,由Bjarne Stroustrup编写。您可以使用访问者模式作为一种变通方法。一篇关于C++中多方法的非常详细的文章:C++中的多方法:找到完整的解决方案
相关文章:
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- C++ 多态性在代码::块 17.12 中不起作用
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- C++矢量 - 放置/擦除不起作用?(多态性)
- 两个不同类的运行时多态性
- 在 PHP 中不使用父类时是否称为多态性
- C++ - 多态性:不能使用功能
- 使用字符串时不能重写多态性
- 多态性在 lambda 函数C++不起作用
- 如何在保持多态性的同时,将成员函数添加到需要它的继承类中,而不会影响其他同级类?
- 多态性抽象语法树(递归下降解析器):不可能
- 多态性和STL容器.指针是不必要的
- 如果重载函数仅被部分重写,则多态性不起作用
- 不存在多态性
- 为什么这C++多态性不起作用
- 多态性不能正常工作
- 在c++中,当多态结构不存在时,如何传递它们
- C++中的多态性不能与引用一起正常工作
- 模板化多态性不起作用
- 两级层次类中的C++多态性:不明白为什么它不起作用