2018年02月02日
《その271》 参照・ポインタ渡し と オブジェクトの動的な型
参照・ポインタ渡し と オブジェクトの動的な型(復習)
【 プログラムの概略 】
足し算用の仮想関数をメンバにもつ基底クラス
add
add からの pubulic派生クラス
ave(平均計算用)
mul(掛け算用)
sub(引き算用)
があります。
各クラスのオブジェクトを生成して、それらのオブジェクト(オブジェクトのコピー や 動的に生成したオブジェクト も含みます)を、関数 func1, func2 に渡しています。
関数 func1 はオブジェクトへの参照を受け取り、
関数 func2 はオブジェクトを指すポインタを受け取ります。
それぞれの場合の計算結果から、動的な型が使われたかどうかを判断することができます。
※【1】〜【3】では、動的な型が使われています。
以下がプログラムです。
#include <iostream>
using namespace std;
// 基底クラス add(足し算用のクラス)
class add {
public:
virtual double cal(double x, double y) {
return x + y;
}
};
// public派生クラス ave(平均計算用のクラス)
class ave : public add {
public:
double cal(double x, double y) {
return (x + y) / 2;
}
};
// public派生クラス mul(掛け算用のクラス)
class mul : public add {
public:
double cal(double x, double y) {
return x * y;
}
};
// public派生クラス sub(引き算用のクラス)
class sub : public add{
public:
double cal(double x, double y) {
return x - y;
}
};
// add型オブジェクトへの参照を受け取る。
void func1(double x, double y, add& r) {
std::cout << "・計算結果は "
<< r.cal(x, y) << " です。\n";
}
// add型オブジェクトを指すポインタを受け取る。
void func2(double x, double y, add* p) {
std::cout << "・計算結果は "
<< p->cal(x, y) << " です。\n";
}
int main() {
// 各型のオブジェクトを生成
add c0; ave c1; mul c2; sub c3;
add* c[] = { &c0, &c1, &c2, &c3 };
cout << "【1】add型オブジェクトへの参照 "
"*c[i] を参照渡し\n";
for (int i = 0; i < 4; i++)
func1(3.5, 2.4, *c[i]);
std::cout << '\n';
cout << "【2】add型オブジェクトを指すポ"
"インタ c[i] をポインタ渡し\n";
for (int i = 0; i < 4; i++)
func2(3.5, 2.4, c[i]);
std::cout << '\n';
// 各型のオブジェクトを動的に生成
add* p[] = {
new add,
new ave,
new mul,
new sub
};
cout << "【3】動的に生成した add型オブ"
"ジェクトを指すポインタ p[i] を"
"ポインタ渡し\n";
for (int i = 0; i < 4; i++)
func2(3.5, 2.4, p[i]);
delete[] * p;
std::cout << '\n';
add a[] = { c0, c1, c2, c3 };
cout << "【4】add型オブジェクトのコピ"
"ー a[i] を参照渡し\n";
for (int i = 0; i < 4; i++)
func1(3.5, 2.4, a[i]);
std::cout << '\n';
cout << "【5】add型オブジェクトのコピ"
"ー a[i] のアドレスをポインタ渡"
"し\n";
for (int i = 0; i < 4; i++)
func2(3.5, 2.4, &a[i]);
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7267904
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック