2017年12月15日
《その179》 using宣言によるアクセス権の調整 & p.174演習4-3
using宣言によるアクセス権の調整
次のプログラムで、基底クラス Base は、
private:
int型の a
public:
コンストラクタ Base
関数 func1
で構成されています。
また、基底クラス Base から private派生によって作られる派生クラス Derived は、実装された基底クラスのメンバに加えて、
private:
int型の b
public:
コンストラクタ Derived
関数 func2
で構成されています。
private派生であるため、基底クラス Base では公開メンバであった 関数 func1 は、派生クラス Derived においては、基本的には外部から呼び出すことができません。
この func1 のアクセス権を using宣言により調整することができます。アクセス権を調整することによって、派生クラス Derived の外部から、関数 func1 を呼び出せるようにできるのです。
下の ★1. の箇所が using宣言です。★2. の箇所で、アクセス権を調整して使えるようになった func1 を利用しています。
// ------------------------------------
#include <iostream>
class Base {
int a;
public:
Base(int aa) : a(aa) { }
void func1() const {
std::cout << "a = " << a << '\n';
}
};
class Derived : private Base {
int b;
public:
Derived(int aa, int bb) : Base(aa), b(bb) { }
void func2() const {
std::cout << "b = " << b << '\n';
}
using Base::func1; // ★1.
};
int main()
{
Derived drvd(11, 22);
drvd.func1(); // ★2.
drvd.func2();
}
// ------------------------------------

新版明解C++中級編 p.174 演習4-3
次のクラス Base型と Derived型に対して、アップキャストとダウンキャストを試みるプログラムを作成せよ。
// ------------------------------------
class Base {
int a;
int b;
public:
Base(int aa, int bb) : a(aa), b(bb) { }
void func() const {
std::cout << "a = " << a << '\n';
std::cout << "b = " << b << '\n';
}
};
class Derived : public Base {
int x;
public:
Derived(int aa, int bb, int xx) : Base(aa, bb), x(xx) { }
void method() const {
func();
std::cout << "x = " << x << '\n';
}
};
// ------------------------------------
◆以下が解答のプログラムです。
// p174_演習4-3
#include <iostream>
class Base {
int a;
int b;
public:
Base(int aa, int bb) : a(aa), b(bb) { }
void func() const {
std::cout << "a = " << a << '\n';
std::cout << "b = " << b << '\n';
}
};
class Derived : public Base {
int x;
public:
Derived(int aa, int bb, int xx) : Base(aa, bb), x(xx) { }
void method() const {
func();
std::cout << "x = " << x << '\n';
}
};
int main()
{
Base base(10, 20);
Derived drvd(11, 22, 33);
// ◆ ------------------▽
Base* ptr_b1 = &base;
ptr_b1->func(); // a = 10
// b = 20
// ptr_b1->method(); /* エラー */
// ---------------------△
// ◆ アップキャスト----▽
Base* ptr_b2 = &drvd;
ptr_b2->func(); // a = 11
// b = 22
// ptr_b2->method(); /* エラー */
// ---------------------△
// ◆ ダウンキャスト----▽
// Derived* ptr_d1 = &base; /* エラー */
// ---------------------△
// ◆ ------------------▽
Derived* ptr_d2 = &drvd;
ptr_d2->func(); // a = 11
// b = 22
ptr_d2->method(); // a = 11
// b = 22
// x = 33
}
// ---------------------△
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7092214
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック