基底クラスを用いて一度に処理を行う方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
タンタル

基底クラスを用いて一度に処理を行う方法

#1

投稿記事 by タンタル » 12年前

検索キーワードが分からないため、こちらで質問させていただきます。タイトル正しいか怪しいですが...
とりあえず以下にソースコードを示します。

main.cpp

コード:

#include <list>
#include"base.h"
using namespace std;

int main(){
	list<Base> base;

	Pen pen;
	Pencil pencil;

	base.push_back(pen);
	base.push_back(pencil);

	for(list<Base>::iterator it = base.begin();it != base.end();it++){
		it->write();
	}


	return 0;
}
base.h

コード:

class Base{
public:
	virtual void write()=0;
};

class Pen : public Base{
public:
	void write();
};

class Pencil : public Base{
public:
	void write();
};
base.cpp

コード:

#include "base.h"
#include <iostream>
using namespace std; 

void Pen::write(){
	cout << "Pen" << endl;
}

void Pencil::write(){
	cout << "Pencil" << endl;
}
今回やりたいことは、pen.write();pencil.write();とふたつに分けて処理を行うところを、Baseクラスを用いてfor文で処理することです。
とりあえず、上記のコードで実行したところ、抽象クラスをインスタンス化できませんと出ました。
当然な結果と思うのですが、こんなことできるよという話をどこかで読んだような気がするので...

このような聞き方しかできないのが何とももどかしいですが、どうすればよいのでしょうか、よろしくお願いします。
丸投げな聞き方ですが、何かキーワードだけでも教えていただければ幸いです。
そもそもこれは実現可能なのでしょうか...

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 基底クラスを用いて一度に処理を行う方法

#2

投稿記事 by softya(ソフト屋) » 12年前

ポインタを使う必要があります。
キーワードは、ポリモーフィズム(多態)ですね。
「プログラミング演習III C++上級編」
http://www.ced.is.utsunomiya-u.ac.jp/le ... lfunc2.php

コード:

#include <iostream>
#include <list>
using namespace std; 

class Base{
public:
    virtual void write()=0;
};
 
class Pen : public Base{
public:
    void write();
};
 
class Pencil : public Base{
public:
    void write();
};
 
void Pen::write(){
    cout << "Pen" << endl;
}
 
void Pencil::write(){
    cout << "Pencil" << endl;
}

 
int main(){
    list<Base*> base;
 
    Pen pen;
    Pencil pencil;
 
    base.push_back(&pen);
    base.push_back(&pencil);
 
    for(list<Base*>::iterator it = base.begin();it != base.end();it++){
		Base* pBase = *it;
        pBase->write();
    }
 
 
    return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

タンタル

Re: 基底クラスを用いて一度に処理を行う方法

#3

投稿記事 by タンタル » 12年前

softya(ソフト屋)さん、ありがとうございます。
無事希望通りの動きができました。

参考サイトおよびキーワードも示していただき、ありがとうございます。今更ながら、なぜ多態性を思いつかなかったのか...
もう一度多態性とポインタについて学びなおそうと思います。

本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る