2018年01月01日
《その215》 参照のクロスキャスト
《その215》 参照のクロスキャスト
前々回《213》と前回《214》で扱ったクロスキャストは、ポインタがキャストの対象でした。
今回は、参照のクロスキャストについてです。
とは言っても、ポインタのときと同じように dynamic_cast<>演算子を用いてキャストするので、前回《214》のプログラムの該当部分だけを書き換えたコードで確認することにします。
プログラムの説明は、前回《214》書いたので、今回は省略します。
下のプログラムの赤文字の部分が変更箇所ですが、
for (int i = 0; i < 3; i++) {
B& r = dynamic_cast<B&>(*a[i]);
cout << r.fb() << " ";
}
だと、参照のクロスキャストをしている気がしない、というのであれば、
for (int i = 0; i < 3; i++) {
A& ref = *a[i];
B& r = dynamic_cast<B&>(ref);
cout << r.fb() << " ";
}
のように書き換えてみると、いいのではないかと思います。
// ------------------------------------
#include <iostream>
using namespace std;
class A {
public:
virtual int fa() = 0;
};
class B {
public:
virtual int fb() = 0;
};
class C : public A, public B {
int x;
int y;
public:
C(int s, int t) : x(s), y(t) { }
int fa() { return x + y; }
int fb() { return x - y; }
};
int main()
{
A* a[] = {
new C(20, 10),
new C(50, 30),
new C(66, 33),
};
for (int i = 0; i < 3; i++)
cout << (*a[i]).fa() << " ";
cout << '\n';
for (int i = 0; i < 3; i++) {
B& r = dynamic_cast<B&>(*a[i]);
cout << r.fb() << " ";
}
cout << '\n';
for (int i = 0; i < 3; i++)
delete a[i];
}
// ------------------------------------
↑ 出力結果は前回と同じです。
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7149467
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック