首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态句柄

多态句柄
EN

Stack Overflow用户
提问于 2009-08-26 16:43:25
回答 6查看 257关注 0票数 0

我在一个层次结构中有不同类型的句柄。

代码语言:javascript
复制
class Handle { common data }
class HandleA : Handle { data specific to a }
class HandleB : Handle { data specific to b }

代码的大部分只处理句柄。但是某些部分( HandleA/HandleB的“管理器”)需要访问子类中的数据。例如:

代码语言:javascript
复制
void ManagerA::DoSomething(Handle handle)
{
    // needs access to data in handleA
}

对于这个问题,有没有不涉及造型的解决方案?

到目前为止我的想法是:

  • 将映射中的附加数据保存在管理器A/B中,并使用句柄查找该数据(附加的哈希表查找)
  • 在句柄中具有多态方法( handle.DoSomething()),这些方法调用适当的管理器方法(每个句柄中需要一个附加指针)
  • 拧紧它并使用强制转换

有什么想法吗?我是不是遗漏了什么?

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-08-26 16:56:07

通过值接收参数,如您在中所做的那样:

代码语言:javascript
复制
void ManagerA::DoSomething(Handle handle)

将“切掉”传入参数中超出Handle实例容量的所有数据,因此您的handle参数将没有“额外数据”( NO“”)。您绝对需要通过指针或引用进行传递(当然,如果不需要修改数据,则可能是const )。

也就是说,正常的多态方法包括在基类中定义虚方法,并在子类中适当地覆盖它们。为什么不遵循这样一个完全正常的体系结构,而不是反对OO方法呢?可能有合理的理由(例如,在visitor模式上采用某些变体,等等),但您只是没有解释足够多的因素,让我们能够沿着这些路线提供帮助;在所提供的信息中,我必须建议“重新架构以使用虚拟方法”。

票数 7
EN

Stack Overflow用户

发布于 2009-08-26 16:47:18

如果数据仅特定于1且只有一种类型,请使用dynamic_cast<T>,这就是它的用途。否则,在基类中声明一个虚函数。

编辑:任何解决方案都不太可能在运行时导致可测量的性能差异。

票数 4
EN

Stack Overflow用户

发布于 2009-08-26 16:52:20

我不会对句柄使用多态性--它是句柄而不是指针,它们被认为绝对隐藏了被引用对象的实现。如果使用虚函数,句柄的用户可能会调用这些函数,这肯定不是一个好主意。

两种常见的解决方案是强制转换和使用映射。如果是后者,您的句柄甚至不必是一个类-它也可以是一个int或更多。在Windows上,句柄是void*指针。我不知道指针背后到底是什么,但我真的不在乎。据我所知,这就是句柄的要点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1336070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档