非表示のフィールドを表示させる方法
C++のアクセス関数access()は、オブジェクトメンバーのアクセス権限の確認や変更に利用されるもので、隠蔽されたフィールドを直接表示するためには使用できません。C++の隠蔽されたフィールドとは、継承関係で、派生クラスが基クラスと同名のメンバ変数を定義し、基クラスの同名フィールドが隠蔽されることを指します。
派生クラスの非公開フィールドにアクセスしたい場合は、スコープ解決演算子 :: を用いてアクセスするクラスを指定できます。これにより、基底クラスのフィールドと派生クラスのフィールドのどちらにアクセスしているかを明示的に示すことができます。
スコープ解決演算子を使用して、非表示フィールドにアクセスする方法を示す例を次に示します。
#include <iostream>
class Base {
public:
int value = 10;
};
class Derived : public Base {
public:
int value = 20;
};
int main() {
Derived derivedObj;
std::cout << “Derived value: ” << derivedObj.value << std::endl; // 输出派生类的 value 字段
std::cout << “Base value: ” << derivedObj.Base::value << std::endl; // 使用作用域解析运算符访问基类的 value 字段
return 0;
}
翻訳結果:
Derived value: 20
Base value: 10
上述の例では Derived クラスは Base クラスを継承し、基底クラスと同じ名前のメンバー変数 value を定義しています。main() 関数の中で Derived クラスのオブジェクト derivedObj が作成されています。value フィールドに直接アクセスすることで、派生クラス内の値を取得できます。スコープ解決演算子 Base:: を用いると、基底クラスで隠蔽されたフィールドにアクセスできます。
派生クラスで基底クラスと同じ名前のフィールドを定義することは混乱を避けるためにできるだけ避けるべきですが、隠れたフィールドの存在はコードの可読性と保守性の問題を引き起こす可能性があるので注意してください。