c++ - 有什么理由去寻找继承/多态性的替代方案吗?

标签 c++ inheritance collections polymorphism iteration

我经常需要能够迭代具有相似但不相同功能的对象集合(例如,想象一个 Task 对象的集合,它们都有自己的 Do() 函数实现,例如).

我通常通过一个基数 Task 来实现它所有任务派生自的类(带有虚拟 Do() )。然后我可以将这些集合保存在 vector<Task*> 中或 vector<unique_ptr<Task>> .

是否有任何理由(或者实际上是可行的方法)以不同的方式执行此操作?

编辑:

我用了(虚)Task为简单起见,对象纯粹作为示例。实际上,当前实际项目的典型案例是 UI 组合框架。在每个布局更新过程中,从根容器遍历“可视树”,并根据子属性(如偏移量、对齐方式、大小等)递归地排列其子控件(子容器控件具有其他子控件等)。根据它们的类型和配置(想想 WPF 的 Canvas、Grid、StackPanel 等)将它们的 child 定位在不同的位置。

通过在容器之间拖放视觉元素和其他动态/用户发起的行为,树在运行时不断变化,并且控件本身是一个不断扩展的系列(通过插件支持新的控件类型) .

最佳答案

好吧,如果你只想对“一组任务”尽可能通用,你可以使用std::function:

std::vector<
    std::function<void()>
> tasks;

这样您的任务就不必全部继承自 Task。或者甚至是对象。

void printHello() { cout << "Hello\n"; }

tasks.push_back(printHello);
tasks.push_back([]{ /* do stuff */ });

struct Object // doesn't inherit from anything
{
    void operator()() const {
        // do other stuff
    }
};

tasks.push_back(Object{});

这种技术称为“类型删除”。

关于c++ - 有什么理由去寻找继承/多态性的替代方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27113067/

相关文章:

c++ - TR1 共享阵列

Java 泛型。如何正确扩展扩展通用抽象参数类型类的参数类型类

java - 从列表转换为集合

Java 集合 - 随机播放重复项

VBA集合: list of keys

c++ - 函数 bool isnan( … ) 在 C++ 中的定点实现

c++ - 在 C++11 中从 std::deque move 一个元素

c++11 - 从参数包中的基类继承构造函数

JavaScript 调用原型(prototype)成员时返回 'undefined'

c++ - 如何改变窗口的音量?