C++で派生クラスからprotectedメンバーにアクセスする方法を徹底解説
C++のクラスには、public・private・protectedという3種類のアクセス指定子があり、それぞれ対応するクラスメンバーを管理します。クラス内のprotectedメンバーは、クラスの外部から直接アクセスできないという点でprivateメンバーとよく似ています。
ただし、両者には重要な違いがあります。protectedメンバーは派生クラス(子クラス)からアクセス可能である一方、privateメンバーは派生クラスからでもアクセスできません。この性質により、protectedは継承関係にあるクラス間でデータや機能を共有したい場合に非常に便利です。
サンプルプログラム
以下は、C++で派生クラス内からprotectedなデータメンバーにアクセスする方法を示すサンプルプログラムです。
#include <iostream>
using namespace std;
class Base {
protected :
int num = 7;
};
class Derived : public Base {
public :
void func() {
cout << "The value of num is: " << num;
}
};
int main() {
Derived obj;
obj.func();
return 0;
}
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
The value of num is: 7
プログラムの解説
それでは、上記のプログラムがどのように動作しているのかを順番に見ていきましょう。
1. 基底クラスと派生クラスの定義
まず、基底クラスBaseでは、データメンバーnumがprotectedとして宣言されています。続いて、Derivedクラスがpublic継承によってBaseクラスを継承しています。Derivedクラス内のメンバー関数func()は、基底クラスのprotectedメンバーであるnumの値を出力します。この部分のコードは以下の通りです。
class Base {
protected :
int num = 7;
};
class Derived : public Base {
public :
void func() {
cout << "The value of num is: " << num;
}
};
ここで注目すべき点は、func()がDerivedクラスのメンバー関数であるため、継承元のBaseクラスのprotectedメンバーnumに直接アクセスできるということです。もしnumがprivateとして宣言されていた場合、このコードはコンパイルエラーになります。
2. main関数でのオブジェクト生成と関数呼び出し
main()関数では、まずDerivedクラスのオブジェクトobjを作成します。その後、objに対してfunc()を呼び出すことで、protectedメンバーnumの値が出力されます。該当するコードは以下の通りです。
int main() {
Derived obj;
obj.func();
return 0;
}
まとめ
protectedメンバーは「外部には非公開、ただし派生クラスには公開」という中間的なアクセスレベルを提供します。継承を活用したクラス設計において、基底クラスの内部状態を派生クラスに安全に共有したい場合に、protectedは非常に有効な手段となります。一方で、むやみに使うとカプセル化が弱まるため、設計意図に応じてpublic・private・protectedを使い分けることが大切です。
-
C++のローカルクラスとは?特徴・制約と実装例をわかりやすく解説
ローカルクラスとは C++において、関数の中で宣言されたクラスは「ローカルクラス」と呼ばれます。これは、そのクラスが定義された関数の内部でのみ有効であるためです。 まず、ローカルクラスの基本的な構造を見てみましょう。 #include<iostream> using namespace std; void func() { class LocalClass { }; } int main() { return 0; } 上記の例では、関数 func() の中で LocalClass が定義されています。このように関数の内部で宣言されたクラスが、ローカルクラス
-
C++のアクセス修飾子の違いを解説:public・private・protectedの使い分け
データ隠蔽(データハイディング)は、オブジェクト指向プログラミング(OOP)における重要な機能の一つです。これにより、プログラム内の関数がクラス型の内部表現に直接アクセスすることを防ぎ、カプセル化を実現できます。クラスメンバーへのアクセス制限は、クラス本体内で指定される「アクセス修飾子」— public、private、protected の3つのセクションによって定義されます。なお、クラスのメンバーおよびクラス自体のデフォルトのアクセスレベルは private です。つまり、明示的に指定しない限り、すべてのメンバーは非公開として扱われます。基本的な構文例class Base { public