STLのvectorの使い方について教えてください。

「図クラス」から派生した「丸クラス」「三角クラス」「四角クラス」があるとします。
それらサブクラスは、純粋仮想関数 draw()を実装しています。
それらサブクラスをstd::vectorにpush_backして、イテレータでdraw()を呼び出します。
この時、std::vector<図>と書くのでしょうか? それとも std::vector<図*> と書くのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/01/17 00:23:10
  • 終了:--

回答(2件)

id:luckyII No.1

luckyII回答回数73ベストアンサー獲得回数02005/01/17 00:40:43

ポイント25pt

ポリモーフィズムを使うならポインタが必要ですから std::vector<図*> でいいんじゃないでしょうかね。

id:nekomilk

そのまま入れたかったのですが、やっぱり無理なんですね…。

2005/01/17 18:48:05
id:mogos No.2

mogos回答回数33ベストアンサー獲得回数02005/01/17 04:20:01

ポイント25pt

std::vector<図*>と書きます。

std::vector<図>と書いた場合、代入する時点で図にコピーされ、いわば型情報が失われた形になるので、図の関数が呼ばれることになります。(純粋仮想関数なら呼び出しようがないので、コンパイルできないはずです。)

一方std::vector<図*>と書いた場合は、そのポインタから動的に呼ばれる関数が決まるので、実行時にその実クラスの関数が呼ばれます。

ということで、C++でポリモーフィズムを実現する際にはポインタで扱います。

参考までにテストコードをつけておきます。

#include <vector>

#include <iostream>

using namespace std;

class Base{

public:

virtual void draw(){

cout << ”this is Base” << endl;

};

};

class A : public Base{

public:

void draw(){

cout << ”this is A” << endl;

}

};

class B : public Base{

public:

void draw(){

cout << ”this is B” << endl;

}

};

int main(){

vector<Base> vec;

vector<Base*> ptr_vec;

A a;

B b;

vec.push_back(a);

vec.push_back(b);

for(vector<Base>::iterator it = vec.begin();it != vec.end();++it){

it->draw();

}

ptr_vec.push_back(&a);

ptr_vec.push_back(&b);

for(vector<Base*>::iterator it = ptr_vec.begin();it != ptr_vec.end();++it){

(*it)->draw();

}

}

id:nekomilk

ありがとうございました♪

2005/01/17 18:48:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません