【问题标题】:Call function on some objects in a vector containing different subclasses在包含不同子类的向量中的某些对象上调用函数
【发布时间】:2012-12-11 13:30:49
【问题描述】:

我有这样的事情:

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()方法,但我仍然希望它们在同一个向量中,因为我还希望能够循环遍历向量并调用draw() on所有元素。有没有办法解决这个问题?我正在考虑使用另一个向量,但我不想这样做。

【问题讨论】:

  • 尝试将dynamic_cast 转换为实现tick 方法的类型?或者,在基类中有一个虚拟实现,对于没有实现该方法的类型没有任何作用......
  • 不,不要做这两件事。如果您有一个对象向量,其中只有一些对象实现了您要调用的函数,那么它们应该位于多个集合中。创建有意义的接口,并且仅在有意义时从它们派生。
  • 这是非常奇怪的声明vector[i]--&gt;tick();
  • 为什么不给A 一个virtual tick 什么都不做的方法。您可以在B 中覆盖它。 (另外,不要创建普通指针的vector。要么使用智能指针的vector,要么使用ptr_vector,这取决于你在复制向量时想要发生的事情。)
  • 是的,我实际上想过让其中一个子类根本不派生自超类,这似乎更有意义。

标签: c++ oop inheritance vector subclass


【解决方案1】:

如果您有 vector 的小部件,但其中只有一些小部件有 dingbat,它们真的都是小部件吗?

在您的情况下,您有一个 vector 不一样的东西。这是你的问题。当然,你可以想出一些复杂而复杂的机制,将战舰放入铅笔杯中。或者你可以做我认为是正确的事情之一:

  1. 确保放入铅笔杯的所有物品都是铅笔
  2. 创建其他地方放置战舰。

上面的 2 号是创建一个单独的向量,正如您已经提到的。数字 1 可能就像在基类上提供一个带有空(平凡)实现的 virtual tick() 方法一样简单。

【讨论】:

    【解决方案2】:

    我认为您可以在this case 使用访问者模式。但这不是最好的解决方案。你刹车里氏替换原则。重新考虑你的层次结构。

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2021-12-28
      • 2021-05-26
      相关资源
      最近更新 更多