1. ホーム
  2. c++

派生クラス内のprotectedメンバへのアクセス

2023-12-12 02:15:05

質問

昨日、あるエラーに遭遇しました。回避するのは簡単ですが、私がC++を正しく理解しているかどうかを確認したいと思います。

protected メンバを持つ基底クラスがあります。

class Base
{
  protected:
    int b;
  public:
    void DoSomething(const Base& that)
    {
      b+=that.b;
    }
};

これはコンパイルして問題なく動作します。 今度はBaseを拡張して、bを使いたいと思います。

class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething(const Base& that)
    {
      b+=that.b;
      d=0;
    }
};

なお、この場合 DoSomething はまだ Base ではなく Derived . 私は、まだ that.b の内部で Derived の中にあるのですが cannot access protected member エラーが発生します (MSVC 8.0 - gcc はまだ試していません)。

明らかに、パブリックゲッターを追加すると b にパブリックなゲッターを追加することで問題は解決しましたが、私はなぜ直接 b . public継承を使用した場合、protected変数は派生クラスからまだ見えているはずなのですが。

どのように解決するのですか?

クラスは、このクラスまたは派生クラスのインスタンスの protected メンバにのみアクセスすることができます。親クラスや従兄弟クラスのインスタンスのprotectedメンバにはアクセスできません。

あなたの場合 Derived クラスがアクセスできるのは b の保護されたメンバにのみアクセスできます。 Derived のインスタンスではなく Base のインスタンスではありません。

コンストラクタを変更して Derived のインスタンスを取るように変更すれば、問題は解決します。