IT TIP

파생 클래스에서 보호 된 멤버에 액세스

itqueen 2021. 1. 8. 22:41
반응형

파생 클래스에서 보호 된 멤버에 액세스


어제 오류가 발생하여 쉽게 해결할 수 있지만 C ++를 올바르게 이해하고 있는지 확인하고 싶었습니다.

보호 된 멤버가있는 기본 클래스가 있습니다.

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를 시도하지 않았습니다).

분명히 공개 getter를 추가 b하면 문제가 해결되었지만 왜 .NET에 직접 액세스 할 수 없는지 궁금합니다 b. 나는 당신이 공용 상속을 사용할 때 보호 변수가 여전히 파생 클래스에 표시됩니다.


유형의 인스턴스 (또는 유형에서 파생 된)에서만 보호 된 멤버에 액세스 할 수 있습니다.
부모 또는 사촌 유형 인스턴스의 보호 된 구성원에 액세스 할 수 없습니다.

귀하의 경우 Derived클래스는 다른 인스턴스가 아닌 인스턴스 b멤버 에만 액세스 할 수 있습니다 .DerivedBase

Derived인스턴스 를 가져 오도록 생성자를 변경하면 문제가 해결됩니다.


언급했듯이 언어가 작동하는 방식입니다.

또 다른 해결책은 상속을 이용하고 부모 메서드에 전달하는 것입니다.

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

의 보호 된 구성원에 액세스 할 수 Derived있지만의 구성원에는 액세스 할 수 없습니다 ( 보호 된 구성원 인 Base유일한 이유 Derived가에서 상속 되었기 때문인 경우에도 Base).


protected 멤버에 액세스 할 수 있습니다.

  • this포인터를 통해
  • 또는 base에서 선언 된 경우에도 동일한 유형의 보호 된 멤버에
  • 또는 친구 클래스, 기능에서

케이스를 해결하기 위해 마지막 두 가지 옵션 중 하나를 사용할 수 있습니다.

Derived :: DoSomething에서 Derived를 수락하거나 Derived friendto Base를 선언 합니다.

class Derived;

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

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

어떤 경우에는 공개 게터를 고려할 수도 있습니다.


class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething()
    {
      b+=this->b;
      d=0;
    }
};

//this will work

static_cast <const Derived *> (pBase)-> Base :: protected_member ...로 시도 할 수 있습니다 .

class Base
{
  protected:
    int b;

  public:
    ...
};

class Derived : public Base
{
  protected:
    int d;

  public:
    void DoSomething(const Base& that)
    {
      b += static_cast<const Derived*>(&that)->Base::b;
      d=0;
    }
    void DoSomething(const Base* that)
    {
      b += static_cast<const Derived*>(that)->Base::b;
      d=0;
    }
};

this포인터를 사용 하여 보호 된 구성원에 액세스

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

참조 URL : https://stackoverflow.com/questions/3247671/accessing-protected-members-in-a-derived-class

반응형