c++ - 将基类转换为派生类还是在基类上创建虚函数更好?

标签 c++ class inheritance

根据这个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/

相关文章:

java - 如何在 Java 程序中通过 java.net.URL 类监控打开的 URL?

C++ : Automatically run function when derived class is constructed

c++ - 我如何获得画笔的句柄,Win32 C++

c++ - 在使用 Rcpp 时从 C++ 调用 GLPK

javascript - 在 qooxdoo 中为图像添加 CSS 类

c# - 在 C# 中将自定义类对象添加到列表框

带有抽象继承错误的Spring Autowired

python - 如何在 BaseClass 方法被 Python 中的 DerivedClass 方法覆盖之前执行它

c++ - 使用 openGL 时立方体未按预期输出

c++ - 多项式计算器