根据这个answer , dynamic_cast
将基类转换为派生类没问题,但他说这表明代码逻辑存在根本问题。
我看过其他答案,使用 dynamic_cast
没问题,因为您可以稍后检查指针的有效性。
现在在我的实际问题中,派生类有一个 GetStrBasedOnCP
函数,它不是虚拟的(只有派生类有它),我必须访问它。
更好的是,在基类上创建一个 virtual void GetStrBasedOnCP
并在派生 OR 上使其成为 virtual
,仅将基类指针转换为派生类?
哦,还要注意这是一个 unsigned int GetStrBasedOnCP
所以基类也必须返回一个值...
最佳答案
“什么更好”这个问题有两个以上的答案,这完全取决于您建模的对象:
- 如果
GetStrBasedOnCP
函数在逻辑上适用于基类,则使用虚拟分派(dispatch)是最佳方法。 - 如果在基类中使用
GetStrBasedOnCP
函数在逻辑上没有意义,您需要使用基于实际类型的方法;你可以使用dynamic_cast
,或者 - 您可以实现多重分派(dispatch),例如通过访问者或通过动态类型的
map
。
逻辑适用性测试是最重要的测试。如果 GetStrBasedOnCP
函数特定于您的子类,将其添加到基类会给使用和维护您的代码的开发人员带来维护难题。
另一方面,多重分派(dispatch)为您提供了一种灵活的方法,让您可以访问静态类型的对象。例如,实现 visitor pattern在您的基类中,您可以让使用 GetStrBasedOnCP
函数处理子类的访问者不同于其他子类。
关于c++ - 将基类转换为派生类还是在基类上创建虚函数更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34293199/