我在一个层次结构中有不同类型的句柄。
class Handle { common data }
class HandleA : Handle { data specific to a }
class HandleB : Handle { data specific to b }代码的大部分只处理句柄。但是某些部分( HandleA/HandleB的“管理器”)需要访问子类中的数据。例如:
void ManagerA::DoSomething(Handle handle)
{
// needs access to data in handleA
}对于这个问题,有没有不涉及造型的解决方案?
到目前为止我的想法是:
有什么想法吗?我是不是遗漏了什么?
谢谢
发布于 2009-08-26 16:56:07
通过值接收参数,如您在中所做的那样:
void ManagerA::DoSomething(Handle handle)将“切掉”传入参数中超出Handle实例容量的所有数据,因此您的handle参数将没有“额外数据”( NO“”)。您绝对需要通过指针或引用进行传递(当然,如果不需要修改数据,则可能是const )。
也就是说,正常的多态方法包括在基类中定义虚方法,并在子类中适当地覆盖它们。为什么不遵循这样一个完全正常的体系结构,而不是反对OO方法呢?可能有合理的理由(例如,在visitor模式上采用某些变体,等等),但您只是没有解释足够多的因素,让我们能够沿着这些路线提供帮助;在所提供的信息中,我必须建议“重新架构以使用虚拟方法”。
发布于 2009-08-26 16:47:18
如果数据仅特定于1且只有一种类型,请使用dynamic_cast<T>,这就是它的用途。否则,在基类中声明一个虚函数。
编辑:任何解决方案都不太可能在运行时导致可测量的性能差异。
发布于 2009-08-26 16:52:20
我不会对句柄使用多态性--它是句柄而不是指针,它们被认为绝对隐藏了被引用对象的实现。如果使用虚函数,句柄的用户可能会调用这些函数,这肯定不是一个好主意。
两种常见的解决方案是强制转换和使用映射。如果是后者,您的句柄甚至不必是一个类-它也可以是一个int或更多。在Windows上,句柄是void*指针。我不知道指针背后到底是什么,但我真的不在乎。据我所知,这就是句柄的要点。
https://stackoverflow.com/questions/1336070
复制相似问题