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

広告

posted by fanblog

2017年12月24日

《その200》 キャスト演算子 & p.207演習5-2


キャスト演算子

 C++ の4種類のキャスト演算子を、次のプログラムのコード中で、簡単にまとめてみました。

// ------------------------------------
#include &ltiostream>
using namespace std;

class Base {
public:
virtual ~Base() { }
};

class Derived : public Base { };

int main()
{
// (1) 動的キャスト dynamic_cast<☆>(x)
// ・多相的クラスへのポインタや参照
// をアップ(ダウン)キャストする。

Derived d;
Base* pt = dynamic_cast&ltBase*>(&d);
cout << typeid(&d).name() << '\n';
cout << typeid(pt).name() << "\n\n";

// (2) 静的キャスト static_cast<☆>(x)
// ・暗黙の型変換でも扱える変換や、
// それに近い変換。

double x = 6.7;
int n = static_cast&ltint>(x);
cout << typeid(x).name() << '\n';
cout << typeid(n).name() << "\n\n";

// (3) 強制キャスト reinterpret_cast<☆>(x)
// ・やや無理筋と思えるような、型
// の"変更"的な変換

int* p = &n;
int a = reinterpret_cast&ltint>(p);
cout << typeid(p).name() << '\n';
cout << typeid(a).name() << "\n\n";

// (4) 定値性キャスト const_cast<☆>(x)
// ・const や volatile を付けたり
// 外したりする変換。

int const* pp = &n;
int* qq = const_cast&ltint*>(p);
cout << typeid(pp).name() << '\n';
cout << typeid(qq).name() << '\n';
}
// ------------------------------------

f05_0051.png



p.207 演習5-2
 次の関数 senior_print の引数を、ポインタでなく参照に書きかえたプログラムを作成せよ。

// ------------------------------------
#include &ltiostream>
#include "Member.h"
#include "VipMember.h"
#include "SeniorMember.h"
using namespace std;

void senior_print(Member* p) {
Member* d = dynamic_cast&ltSeniorMember*>(p);

if (d)
d-&gtprint();
}

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

senior_print(&kaneko);
senior_print(&mineya);
senior_print(&susaki);
}
// ------------------------------------

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

// p207_演習5-2
#include &ltiostream>
#include "Member.h"
#include "VipMember.h"
#include "SeniorMember.h"
using namespace std;

void senior_print(Member& r)
{
try {
dynamic_cast&ltSeniorMember&>(r);
r.print();
}
catch (bad_cast) { }
}


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

senior_print( kaneko );
senior_print( mineya );
senior_print( susaki );
}

 前回《199》の 演習5-1 のコードに、この 演習5-2 の関数 senior_print を書き加え、さらに main関数を、この解答の main関数と入れ替えたプログラムの実行結果は、次のようになります。長寿会員の情報のみが表示されています。

f05_02.png


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

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

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

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





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

お名前:

メールアドレス:


ホームページアドレス:

コメント:

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

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

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

たまに、クリック お願いします 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日以上新しい記事の更新がないブログに表示されております。

Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: