パブリック継承の利点を維持しながら、継承されたメンバーが派生クラスでアクセスできないようにする方法はありますか?

JensB

派生クラスが継承する保護されたメンバーを保持するクラスがある場合:

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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ