派生クラスが継承する保護されたメンバーを保持するクラスがある場合:
class Base1
{
protected:
int baseMember_;
};
class Base2 : public Base1
{
public:
void printBaseMember
{
std::cout << baseMember_ << std::endl;
}
};
baseMember_
から派生したクラスでアクセスできないようにするにはどうすればよいBase2
ですか?
明らかな解決策は、単に継承をプライベートにすることです:class Base2 : private Base1
、しかしこれは私の場合は機能しません。その理由は、プライベート継承により、Base2とBase1の間のis-a関係が削除されるためです。これは、コード内のいくつかの場所でBase1*
型のオブジェクトを型に割り当てる必要があるためBase2*
です。
パブリック継承を使用しながら、派生クラスが保護されたメンバーにアクセスできないようにする方法はありますか?
パブリック継承を使用しながら、派生クラスが保護されたメンバーにアクセスできないようにする方法はありますか?
継承されたメンバーのアクセスモードは、次のusing
宣言によって変更できます。
class Base1
{
protected:
int baseMember_;
};
class Base2 : public Base1
{
public:
void printBaseMember()
{
std::cout << baseMember_ << std::endl;
}
private:
using Base1::baseMember_; // baseMember_ is private in the context
// of Base2; its derived classes cannot access it
};
またから、たとえば、他の方法でアクセスモードを変更することができますprotected
しますpublic
。これはgodbolt.orgの例です。
ただし、から派生したクラスBase2
は引き続きBase1::baseMember_
この名前でアクセスできることに注意してください。これにより、のアクセスチェックがバイパスされBase2
ます。の修飾されていない名前を介してアクセスすることはできませんbaseMember_
。あなたはプライベート継承を使用する場合がありますBase2
からをBase1
し、using
すべてのパブリックメンバー-declareBase1
中にBase2
これを緩和します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加