2017年12月16日
《その181》 メンバ関数の隠蔽(派生クラス内で同名の関数を定義)
基底クラスのメンバ関数の隠蔽
派生クラス内で、基底クラスのメンバ関数と同名の関数を定義すると、基底クラスのメンバ関数は隠蔽されます。
次のプログラムでは、基底クラス Aaa がメンバ関数 print を持っていて、派生クラス Bbb も同名のメンバ関数 print を持っています。このようなときは、基底クラスのほうのメンバ関数が隠蔽されます。
Aaa のメンバ関数は print();
Bbb のメンバ関数は print(int x);
で、仮引数が異なりますが、仮引数とは関係なく関数名が同じであれば隠蔽されます。
基底クラス Aaa のメンバ関数を呼び出す場合には、有効範囲解決演算子「 :: 」を用いて Aaa::print() のようにします。
// ------------------------------------
#include <string>
#include <iostream>
class Aaa {
int a;
public:
Aaa(int x = 10) : a(x) { }
void print() { std::cout << "a = " << a << '\n'; }
// クラス Aaa のメンバ関数
};
class Bbb : public Aaa{
int b;
public:
Bbb(int x = 20, int y = 200) : Aaa(x), b(y) { }
void print(int x) {
std::cout << "整数 " << x
<< " を受け取りました。\n";
std::cout << "b = " << b << '\n'; }
// クラス Bbb のメンバ関数
// 基底クラス Aaa のメンバ関数と同名なので、
// 基底クラスの関数 print は隠蔽されます。
};
int main() {
Aaa aaa; // Aaa型オブジェクトの aaa を生成。
Bbb bbb; // Bbb型オブジェクトの bbb を生成。
aaa.print();
std::cout << '\n';
bbb.print(66);
// Bbb型の関数 print が呼び出されます。
// (Aaa型の関数 print は隠蔽されているため)
std::cout << '\n';
bbb.Aaa::print();
// 有効範囲解決演算子「 :: 」を用いて Aaa::print
// とすれば、基底クラス Aaa の関数 print
// にアクセスすることができます。
}
// ------------------------------------
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7097572
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック