C++ 继承和确定类型

标签 c++ inheritance polymorphism

所以我正在做一个个人项目(试图在 C++ 方面做得更好),并且我正在努力让它工作:

我有一个 ABC 类 使用纯虚函数 interactWith(A* target);

然后我有两个派生类,B 类和 C 类。

但是,B 类与 C 类的交互必须不同于与另一个 B 类的交互

我在 ABC 中找到了一种使用 if/else 和虚拟 getType() 的方法,但我很好奇是否有更优雅的方法,或者我是否只是在做一些非常愚蠢的事情,如果我我正在做一些愚蠢的事情(这是很有可能的),我应该从哪里开始寻找更好的解决方案(即更合适的设计模式)

请注意:我没有使用 boost,我宁愿暂时避免使用它,等我真正擅长编程时再开始学习它

我们欢迎您提供任何帮助。请和谢谢

有一点我应该注意:类 B 和 C 将(应该)只能通过 A* 可见

最佳答案

您要实现的是 double dispatch : 一个对于两个对象表现为虚拟的函数。

有几种方法可以实现它,最常见的一种是使用 visitor pattern。 .

Scott Meyers 有一个关于实现双重分派(dispatch)的精彩章节(他的 "More Effective C++" 书中的第 31 项)。他从访问者模式的讨论开始,然后用 RTTI 进行了一个非常好的实现。 .

关于C++ 继承和确定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10924100/

相关文章:

c++ - cv::DataType<> 与 cv::traits::Type<>

c++ - 使用 SWIG 实现 C++ 和 Ruby 之间的多态性

C++ 问题 : Class Promotion using derived class

c++ - 在链表中使用 INT_MAX 查找两个最小值会产生段错误

C++初始化列出多个初始化

c++ - C++ 中的 extern 和 const

.net - 继承和复合外键 - 一部分在基类中,另一部分在派生类中

c++ - 不从接口(interface)继承的虚函数

inheritance - 在 Symfony2 中创建具有可扩展实体的可移植包

java - 如果方法是抽象的,是否需要向下转换?