将基类强制转换为派生类或在基类上创建虚函数是否更好?

时间:2015-12-15 15:33:44

标签: c++ class inheritance

根据这个answerdynamic_cast基类到派生类很好,但他说这表明代码逻辑存在根本问题。

我查看了其他答案并使用dynamic_cast很好,因为您可以稍后检查指针的有效性。

现在在我真正的问题中,派生类有一个GetStrBasedOnCP函数,它不是虚拟的(只有派生类有它),我必须访问它。

更好的是,在基类上创建virtual void GetStrBasedOnCP并在派生的OR上创建virtual,只是将基类指针强制转换为派生类?

哦也注意到这是unsigned int GetStrBasedOnCP所以基类也必须返回一个值...

3 个答案:

答案 0 :(得分:2)

你必须在其中拥有虚函数的基类是否有意义?

如果没有,则不应将该函数包含在基类中。请记住,最佳做法涵盖了一般情况。有时您需要做一些通常不会使代码正常工作的事情。关键是你需要的是清晰,简洁,易懂的代码

答案 1 :(得分:2)

"什么是更好的"有两个以上的答案。问题,这一切都取决于你的建模:

  • 如果GetStrBasedOnCP函数在逻辑上适用于基类,则使用虚拟调度是最佳方法。
  • 如果在基类中使用GetStrBasedOnCP函数没有逻辑意义,则需要使用基于实际类型的方法;您可以使用dynamic_cast
  • 您可以实施多次发送,例如通过访问者或map动态类型。

逻辑适用性测试是最重要的测试。如果GetStrBasedOnCP函数特定于您的子类,则将其添加到基类将为开发人员使用和维护代码创建维护难题。

另一方面,多分派为您提供了一种灵活的方法,可让您访问静态类型的对象。例如,在基类中实现visitor pattern可以让使用GetStrBasedOnCP函数处理子类的访问者与其他子类不同。

答案 2 :(得分:1)

有很多"它取决于"。

如果你能保证基本指针是正确的子指针,那么你可以使用dynamic_cast

如果您不能保证基指针指向哪种子类型,您可能希望将该函数放在基类中。

但是,请注意,基类的所有子项都将获得您放入基类的任何功能。所有孩子都有这个功能是否有意义?

您可能想要查看您的设计。