ページ 11

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

Posted: 2014年2月10日(月) 20:36
by タンタル
検索キーワードが分からないため、こちらで質問させていただきます。タイトル正しいか怪しいですが...
とりあえず以下にソースコードを示します。

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文で処理することです。
とりあえず、上記のコードで実行したところ、抽象クラスをインスタンス化できませんと出ました。
当然な結果と思うのですが、こんなことできるよという話をどこかで読んだような気がするので...

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

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

Posted: 2014年2月10日(月) 20:52
by softya(ソフト屋)
ポインタを使う必要があります。
キーワードは、ポリモーフィズム(多態)ですね。
「プログラミング演習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;
}

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

Posted: 2014年2月10日(月) 21:50
by タンタル
softya(ソフト屋)さん、ありがとうございます。
無事希望通りの動きができました。

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

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