問題6:virtualと仮想関数
| この問題を解くためには… |
| → 応用編第6日目参照 |
|---|
probex6-2.(難易度:★)
以下のプログラムは、二種類の飛行機、戦闘機(FighterAircraft)と、旅客機(PassengerPlane)クラスのインスタンスを生成し、メンバ関数を実行するプログラムである。この2つのクラスには、共通するメンバが存在する。
そこで、これら2つのクラスに共通するメンバを、飛行機(AirPlane)クラスに集約し、FighterAiracraftクラス、およびPassengerPlaneは、それらのクラスを継承したものにするように、プログラムを書きかかえなさい。ただし、この時、AirPlaneは、完全仮想関数fly()を持つ抽象クラスとすること。
fighteraircraft.h
#ifndef _FIGHTERAIRCRAFT_H_
#define _FIGHTERAIRCRAFT_H
#include <iostream>
#include <string>
using namespace std;
// 戦闘機クラス
class FighterAircraft{
private:
string m_type;
public:
// コンストラクタ
FighterAiracraft();
// タイプの取得
string getType();
// 飛行する
void fly();
// 戦闘する
void fight();
};
#endif // _FIGHTERAIRCRAFT_H_
#include "figheraircraft.h"
// コンストラクタ
FighterAircraft::FighterAircraft()
{
m_type = "戦闘機";
}
// タイプの取得
string FighterAircraft::getType()
{
return m_type;
}
// 飛行する
void FighterAircraft::fly()
{
cout << "攻撃に出るために飛行" << endl;
}
// 戦闘する
void FighterAircraft::fight()
{
cout << "戦闘します" << endl;
}
#ifndef _PASSENGERPLANE_H_
#define _PASSENGERPLANE_H_
#include <iostream>
#include <string>
using namespace std;
// 旅客機クラス
class PassengerPlane{
private:
string m_type;
public:
// コンストラクタ
PassengerPlane();
// タイプの取得
string getType();
// 飛行する
void fly();
// 乗客を運ぶ
void carryPassengers();
};
#endif // _PASSENGERPLANE_H_
#include "passengerplane.h"
// コンストラクタ
PassengerPlane::PassengerPlane()
{
m_type = "旅客機";
}
// タイプの取得
string PassengerPlane::getType()
{
return m_type;
}
// 飛行する
void PassengerPlane::fly()
{
cout << "乗客を乗せて目的地まで飛行します。" << endl;
}
// 乗客を運ぶ
void PassengerPlane::carryPassengers()
{
cout << "乗客を目的地まで運びます" << endl;
}
#include <iostream>
#include "fighteraircraft.h"
#include "passengerplane.h"
using namespace std;
int main(){
// 戦闘機クラスのインスタンスの生成
FighterAircraft* fighter = new FighterAircraft();
PassengerPlane* airlinear = new PassengerPlane();
// 戦闘機クラスの処理
fighter->fly(); // 飛行する
fighter->fight(); // 戦闘する
// 旅客機クラスの処理
airlinear->fly(); // 飛行する
airlinear->carryPassengers(); // 乗客を運ぶ
// delete処理
delete fighter;
delete airlinear;
}
攻撃に出るため飛行
戦闘します
乗客を乗せて目的地まで飛行します。
乗客を目的地まで運びます。
戦闘します
乗客を乗せて目的地まで飛行します。
乗客を目的地まで運びます。
probex6-1.(難易度:★★)
以下のプログラムは、野球選手(BaseballPlayer)クラスを基に派生した、ピッチャー(Pitcher)クラス、捕手(Catcher)クラス、野手(Fielder)クラスのインスタンスをチームのメンバーの数だけ生成し、その内容を表示したプログラムである。PitcherクラスおよびFielderクラスを参考にして、捕手(Catcher)クラスを作成し、プログラムを完成させなさい。
baseballplayer.h
#ifndef _BASEBALLPLAYER_H_
#define _BASEBALLPLAYER_H_
#include <iostream>
#include <string>
using namespace std;
class BaseballPlayer{
protected:
// 背番号
int m_number;
// プレイヤーの種類
string m_kind;
// 名前
string m_name;
public:
// 名前の取得
int getNumber();
// 種類の取得
string getKind();
// 名前の取得
string getName();
// プレイ(純粋仮関数)
virtual void play()=0;
};
#endif // _BASEBALLPLAYER_H_
#ifndef _FIELDER_H_
#define _FIELDER_H_
#include "BaseballPlayer.h"
class Fielder : public BaseballPlayer{
public:
// コンストラクタ
Fielder(string name,int number);
// 野手がプレイする
void play();
};
#endif // _FIELDER_H_
#include "fielder.h"
Fielder::Fielder(string name,int number)
{
m_name = name;
m_number = number;
m_kind = "キャッチャー";
}
// ピッチャーがプレイする
void Fielder::play()
{
cout << "ピッチャーの球を受ける" << endl;
}
#ifndef _PITCHER_H_
#define _PITCHER_H_
#include "BaseballPlayer.h"
class Pitcher : public BaseballPlayer{
public:
// コンストラクタ
Pitcher(string name,int number);
// ピッチャーがプレイする
void play();
};
#endif //_PITCHER_H_
#include "pitcher.h"
Pitcher::Pitcher(string name,int number)
{
m_name = name;
m_number = number;
m_kind = "ピッチャー";
}
// ピッチャーがプレイする
void Pitcher::play()
{
cout << "投球する" << endl;
}
#include "pitcher.h"
#include "catcher.h"
#include "fielder.h"
int main(){
// 野球選手の配列作成
BaseballPlayer* players[9];
players[0] = new Fielder("山田",8);
players[1] = new Fielder("高坂",16);
players[2] = new Fielder("ゴメス",16);
players[3] = new Fielder("中村",6);
players[4] = new Fielder("春日井",32);
players[5] = new Fielder("堀田",5);
players[6] = new Catcher("逢坂",54);
players[7] = new Fielder("トーマス",11);
players[8] = new Pitcher("斉藤",34);
int i;
for(i = 0; i < 9; i++){
cout << "---------------------------------------------" << endl;
cout << "名前:" << players[i]->getName() << endl;
cout << "背番号:" << players[i]->getNumber() << endl;
cout << "種類:" << players[i]->getKind() << endl;
}
// インスタンスの消去
for(i = 0; i < 9; i++){
delete players[i];
}
return 0;
}
---------------------------------------------
名前:山田
背番号:8
種類:キャッチャー
---------------------------------------------
名前:高坂
背番号:16
種類:キャッチャー
---------------------------------------------
名前:ゴメス
背番号:16
種類:キャッチャー
---------------------------------------------
名前:中村
背番号:6
種類:キャッチャー
---------------------------------------------
名前:春日井
背番号:32
種類:キャッチャー
---------------------------------------------
名前:堀田
背番号:5
種類:キャッチャー
---------------------------------------------
名前:逢坂
背番号:54
種類:キャッチャー
---------------------------------------------
名前:トーマス
背番号:11
種類:キャッチャー
---------------------------------------------
名前:斉藤
背番号:34
種類:ピッチャー
名前:山田
背番号:8
種類:キャッチャー
---------------------------------------------
名前:高坂
背番号:16
種類:キャッチャー
---------------------------------------------
名前:ゴメス
背番号:16
種類:キャッチャー
---------------------------------------------
名前:中村
背番号:6
種類:キャッチャー
---------------------------------------------
名前:春日井
背番号:32
種類:キャッチャー
---------------------------------------------
名前:堀田
背番号:5
種類:キャッチャー
---------------------------------------------
名前:逢坂
背番号:54
種類:キャッチャー
---------------------------------------------
名前:トーマス
背番号:11
種類:キャッチャー
---------------------------------------------
名前:斉藤
背番号:34
種類:ピッチャー









