5

抱歉,如果之前有人问过这个问题,刚刚学习C++,曾尝试搜索但不确定关键字是什么。

有可能做到这一点吗?

class Car {
   public:
      void addColor(string c) {
          color = c;
      }

   private:
      string color;
}

class Honda:public Car {}
class Toyota:public Car {}

int main() {
    vector<Car> v;

    Honda *car1 = new Honda();
    car1.addColor("green");

    Toyota *car2 = new Toyota();
    car2.addColor("blue");

    v.push_back(car1);
    v.push_back(car2);

    for (int i = 0; i < v.size(); i++) {
        cout << v[i].color << endl; // should output green, blue
    }

}

如果可能的话,最正确/最有效的方法是什么?

编辑 1

哇,谢谢大家!

4

3 回答 3

2

你的向量总是保持基本类型,汽车,切片。查找“多态 STL 集合”“多态向量”或想了解如何存储派生类。

是一个例子

于 2013-06-26T11:58:52.700 回答
1

有两种方法可以处理这个问题。假设我们有以下类定义:

#include <string>
class Car {
   public:
      Car(const std::string& color) : color(color) {}
      virtual ~Car() {}

      std::string color;
};

class Honda:public Car {};
class Toyota:public Car {};

请注意,我删除了 setter,只是将成员公开。你可能想要也可能不想要这个,但对于这个例子来说,这并不重要。这是一种分配堆栈上的所有内容并获取这些对象的地址的方法。在这个例子中这很好(car1并且car2不需要超过main函数)。在实际代码中,这可能不是真的(即对象可能需要比创建它们的函数更长寿,请参见下文):

#include <iostream>
#include <vector>

int main() {
    Honda car1("green");
    Toyota car2("blue");
    std::vector<Car*> cars; // vector of non-owning pointers

    v.push_back(&car1);
    v.push_back(&car2);

    for(auto& car : cars) {
        std::cout << car.color << "\n";
    }
}

或者,在堆上分配对象:

int main() {
    std::vector<std::unique_ptr<Car>> cars; // vector of owning pointers

    v.emplace_back(new Honda("green"));
    v.push_back(new Toyota("blue"));

    for(auto& carptr : cars) {
        std::cout << carptr->color << "\n";
    }
}
于 2013-06-26T12:32:10.910 回答
0

你走对了,只有一些小问题需要解决:

  • 向基类 ( Car) 添加一个 getter;
  • 更改向量类型(为 a vector<Car*>);
  • a.b需要时更换a->b
  • 修复类定义后缺少的分号。

给你:

#include <iostream>
#include <vector>

using namespace std;

class Car {
   public:
      virtual ~Car ();
      void addColor(string c) {
          color = c;
      }

      string getColor () {
          return color;
      }

   private:
      string color;
};

class Honda:public Car {};
class Toyota:public Car {};

int main() {
    vector<Car*> v;

    Honda car1;
    car1.addColor("green");

    Toyota car2;
    car2.addColor("blue");

    v.push_back(&car1);
    v.push_back(&car2);

    for (int i = 0; i < v.size(); i++) {
        cout << v[i]->getColor () << endl; // should output green, blue
    }
}

顺便说一句,如果您希望您的子类有自己的方法来操纵颜色,只需像virtual在汽车类中一样声明方法,您可以在子类中重新定义它。

另一个小点。你不能让你的向量成为一个vector<Car>。因为子类的大小可能与母类的大小不同(想象一下int appeal;在你的Honda类中添加一个),因为向量只能存储大小相同的元素。

于 2013-06-26T11:58:38.220 回答