在包含不同子类的向量中的某些对象上调用函数

时间:2012-12-11 13:30:50

标签: c++ oop inheritance vector subclass

我有这样的事情:

class A {
    void add (A* a) {
        //add a to a vector<A*>
    }
    virtual void draw() = 0;
}

class B : public A {
    void tick() {}
    void draw() {}
}

class C : public A {
    void draw() {}
}

现在我要做的就是有一个这样的循环:

for(int i=0; i<vector.size(); i++) {
    vector[i]->tick();
}

问题是并非此向量中的所有元素都具有tick()方法,但我仍然希望将它们放在同一个向量中,因为我还希望能够遍历向量并调用{{ 1}}关于所有元素。有什么方法可以解决这个问题吗?我正在考虑使用另一种载体,但我宁愿不这样做。

2 个答案:

答案 0 :(得分:5)

如果你有一个vector小部件,但只有部分小部件有dingbat,那么它们真的都是小部件吗?

在你的情况下,你有vector个不一样的东西。这是你的问题。当然,你可以想出一些hacky,复杂的机制,把一艘战舰放在铅笔杯里。或者你可以做我认为合适的事情之一:

  1. 确保你所放入铅笔杯的所有东西都是铅笔
  2. 创建其他地方以放置战舰。
  3. 上面的数字2正在创建一个单独的向量,正如您已经提到的那样。数字1可能就像在基类上提供一个空(普通)实现的virtual tick()方法一样简单。

答案 1 :(得分:0)

我认为你可以在this case使用访客模式。但这不是最好的解决方案。你制动Liskov替代原则。重新思考层次结构。