アフィリエイト広告を利用しています

広告

posted by fanblog

2017年12月24日

《その199》 ダウンキャストが可能になる条件 & p.207演習5-1


 前回《198》のプログラムの結果から、次のような場合にはダウンキャストが可能である
ことがわかります。

◆ クラスオブジェクトを指すポインタをキャストした後のポインタ型が、そのオブジェクトを指すことができるポインタ型である場合。
  ( または、クラスオブジェクトの参照をキャストした後の参照型が、そのオブジェクトを参照することができる参照型である場合。)


新版明解C++中級編 p.207 演習5-1
 次の会員クラス群 Member.h, VipMember.h, SeniorMember.h に、
自己紹介をする仮想関数 introduce を追加せよ。表示内容は自分で考えること。

// ------------------------------------
// 一般会員クラス Member.h
#ifndef ___Member
#define ___Member

#include <iostream>
#include <string>

class Member {
std::string full_name;
int number;
double weight;

public:
Member(const std::string& name,
int no,
double w
)
: full_name(name), number(no) {
set_weight(w);
}

std::string name() const {
return full_name;
}

int no() const { return number; }

double get_weight() const {
return weight;
}

void set_weight(double w) {
weight = (w > 0) ? w : 0;
}

virtual void print() const {
std::cout << "No." << number
<< " : " << full_name
<< "(" << weight
<< "kg)\n";
}
};

#endif
// ------------------------------------
// ------------------------------------
// 優待会員クラス VipMember.h
#ifndef ___VipMember
#define ___VipMember

#include <string>
#include <iostream>
#include "Member.h"

class VipMember : public Member {
std::string privilege; // 特典

public:
VipMember(const std::string& name,
int no,
double w,
const std::string& prv
)
: Member(name, no, w) {
set_privilege(prv);
}

std::string get_privilege() const {
return privilege;
}

void set_privilege(
const std::string& prv
) {
privilege
= (prv != "") ? prv : "未登録";
}

void print() const {
std::cout << "No." << no()
<< " : " << name() << "("
<< get_weight() << "kg)"
<< "特典 : " << privilege
<< '\n';
}
};

#endif
// ------------------------------------
// ------------------------------------
// 長寿会員クラス SeniorMember.h
#ifndef ___SeniorMember
#define ___SeniorMember

#include <string>
#include <iostream>
#include "Member.h"

class SeniorMember : public Member {
int care_level; // 要介護度

public:
SeniorMember(
const std::string& name,
int no,
double w,
int level
)
: Member(name, no, w) {
set_care_level(level);
}

int get_care_level() const {
return care_level;
}

void set_care_level(int level) {
care_level
= (level >= 1 && level <= 5)
? level : 0;
}

void print() const {
std::cout << "No." << no()
<< " : " << name() << "("
<< get_weight() << "kg)"
<< "要介護度 … "
<< care_level << '\n';
}
};

#endif
// ------------------------------------
// ------------------------------------
#include <iostream>
#include "Member.h"
#include "VipMember.h"
#include "SeniorMember.h"
using namespace std;

int main() {
Member kaneko("金子健太", 15, 75.2);
VipMember mineya("峰屋龍次", 17, 89.2, "会費全額免除");
SeniorMember susaki("州崎賢一", 43, 63.7, 3);
}
// ------------------------------------


◆以下が解答のプログラムです。

// p207_演習5-1
// ------------------------------------
// 一般会員クラス Member.h
#ifndef ___Member
#define ___Member

#include <iostream>
#include <string>

class Member {
std::string full_name;
int number;
double weight;

public:
Member(const std::string& name,
int no,
double w
)
: full_name(name), number(no) {
set_weight(w);
}

std::string name() const {
return full_name;
}

int no() const { return number; }

double get_weight() const {
return weight;
}

void set_weight(double w) {
weight = (w > 0) ? w : 0;
}

virtual void print() const {
std::cout << "No." << number
<< " : " << full_name
<< "(" << weight
<< "kg)\n";
}

virtual void introduce() const {
std::cout << "会員番号 " << no()
<< "番の " << name() << "と申し"
"ます。"
"体重は " << get_weight()
<< "kgです。\n";

}
};

#endif
// ------------------------------------
// ------------------------------------
// 優待会員クラス VipMember.h
#ifndef ___VipMember
#define ___VipMember

#include <string>
#include <iostream>
#include "Member.h"

class VipMember : public Member {
std::string privilege; // 特典

public:
VipMember(const std::string& name,
int no,
double w,
const std::string& prv
)
: Member(name, no, w) {
set_privilege(prv);
}

std::string get_privilege() const {
return privilege;
}

void set_privilege(
const std::string& prv
) {
privilege
= (prv != "") ? prv : "未登録";
}

void print() const {
std::cout << "No." << no()
<< " : " << name() << "("
<< get_weight() << "kg)"
<< "特典 : " << privilege
<< '\n';
}

void introduce() const {
std::cout << "会員番号 " << no()
<< "番の " << name() << "と申し"
"ます。"
"体重は " << get_weight()
<< "kgです。\n"
<< privilege << "の優待会員です。";
}

};

#endif
// ------------------------------------
// ------------------------------------
// 長寿会員クラス SeniorMember.h
#ifndef ___SeniorMember
#define ___SeniorMember

#include <string>
#include <iostream>
#include "Member.h"

class SeniorMember : public Member {
int care_level; // 要介護度

public:
SeniorMember(
const std::string& name,
int no,
double w,
int level
)
: Member(name, no, w) {
set_care_level(level);
}

int get_care_level() const {
return care_level;
}

void set_care_level(int level) {
care_level
= (level >= 1 && level <= 5)
? level : 0;
}

void print() const {
std::cout << "No." << no()
<< " : " << name() << "("
<< get_weight() << "kg)"
<< "要介護度 … "
<< care_level << '\n';
}

void introduce() const {
std::cout << "会員番号 " << no()
<< "番の " << name() << "と申し"
"ます。"
"体重は " << get_weight()
<< "kgです。\n"
<< "要介護度 " << care_level
<< "の長寿会員です。";
}

};

#endif
// ------------------------------------
// ------------------------------------
// 自己紹介の表示 p207_5-1.cpp
#include <iostream>
#include "Member.h"
#include "VipMember.h"
#include "SeniorMember.h"
using namespace std;

void func(const Member& m) {
cout << "みなさん、こんにちは。";
m.introduce();
cout << "よろしくお願いいたします。\n\n";
}


int main() {
Member kaneko("金子健太", 15, 75.2);
VipMember mineya("峰屋龍次", 17, 89.2, "会費全額免除");
SeniorMember susaki("州崎賢一", 43, 63.7, 3);

func(kaneko);
func(mineya);
func(susaki);

}
// ------------------------------------

f05_01.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7123206
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。