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

あなたのベクトルは常にベースタイプのCar、スライスされたものを保持します。「ポリモーフィック STL コレクション」「ポリモーフィック ベクトル」を検索するか、派生クラスを格納する方法を参照してください。

ここに例があります

于 2013-06-26T11:58:52.700 に答える
0

あなたは正しい道を進んでいました。修正すべき点はほんのわずかでした:

  • 基本クラスに getter を追加します ( Car);
  • ベクトル型を ( 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;ます (クラスに a を追加することを想像してください)。Honda

于 2013-06-26T11:58:38.220 に答える