根据这个answer,dynamic_cast
基类到派生类很好,但他说这表明代码逻辑存在根本问题。
我查看了其他答案并使用dynamic_cast
很好,因为您可以稍后检查指针的有效性。
现在在我真正的问题中,派生类有一个GetStrBasedOnCP
函数,它不是虚拟的(只有派生类有它),我必须访问它。
更好的是,在基类上创建virtual void GetStrBasedOnCP
并在派生的OR上创建virtual
,只是将基类指针强制转换为派生类?
哦也注意到这是unsigned int GetStrBasedOnCP
所以基类也必须返回一个值...
答案 0 :(得分:2)
你必须在其中拥有虚函数的基类是否有意义?
如果没有,则不应将该函数包含在基类中。请记住,最佳做法涵盖了一般情况。有时您需要做一些通常不会使代码正常工作的事情。关键是你需要的是清晰,简洁,易懂的代码
答案 1 :(得分:2)
"什么是更好的"有两个以上的答案。问题,这一切都取决于你的建模:
GetStrBasedOnCP
函数在逻辑上适用于基类,则使用虚拟调度是最佳方法。GetStrBasedOnCP
函数没有逻辑意义,则需要使用基于实际类型的方法;您可以使用dynamic_cast
或map
动态类型。逻辑适用性测试是最重要的测试。如果GetStrBasedOnCP
函数特定于您的子类,则将其添加到基类将为开发人员使用和维护代码创建维护难题。
另一方面,多分派为您提供了一种灵活的方法,可让您访问静态类型的对象。例如,在基类中实现visitor pattern可以让使用GetStrBasedOnCP
函数处理子类的访问者与其他子类不同。
答案 2 :(得分:1)
有很多"它取决于"。
如果你能保证基本指针是正确的子指针,那么你可以使用dynamic_cast
。
如果您不能保证基指针指向哪种子类型,您可能希望将该函数放在基类中。
但是,请注意,基类的所有子项都将获得您放入基类的任何功能。所有孩子都有这个功能是否有意义?
您可能想要查看您的设计。