【发布时间】:2019-07-05 14:19:32
【问题描述】:
我对 C++ 比较陌生。我们有一个抽象基类和两个派生类。
class PositionBase (abstract)
class PositionLenght: PositionBase
class PositionAngle: PositionBase
PositionBase 包含获取名称等功能。
派生类具有GetLenght() 或GetAngle(); 等方法
(旧)应用程序包含一个包含派生类的数组。
假设,我从array[1] 获取对象,并根据它的类型,我想运行GetLength() or GetAngle()。然后我需要知道我从数组中得到的对象类型。
当我使用时:
if(PositionBase->IsKindOf(RUNTIME_CLASS(PositionLenght))))
{do something}
它不起作用。什么是有效的
if(typeid(*PositionBase) == typeid(PositionLenght)))
{do something}
我也可以只是“dynamic_cast”对象,如果它不返回 NULL,我很好。
在C# 中我会使用接口,在C++ 中处理这个问题的首选方法是什么?
【问题讨论】:
-
在 C++ 中,可以将纯抽象类视为“接口”。
-
另外请不要描述你的代码,尝试创建一个minimal reproducible example来显示它。
-
这种基于类类型的条件逻辑是代码异味。处理这个问题的传统 OOP 方法是将逻辑移到派生类中,通过基接口调用它,然后让多态处理选择调用哪个版本的函数。
-
如果您需要知道一个类是给定类型的,那么不要将它存储为另一种类型。如果您有一个
PositionLenght数组和另一个PositionAngle数组,问题就会自行解决。
标签: c++ class inheritance