ことがわかります。
◆ クラスオブジェクトを指すポインタをキャストした後のポインタ型が、そのオブジェクトを指すことができるポインタ型である場合。
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);
}
// ------------------------------------