파생 클래스에서 보호 된 멤버에 액세스
어제 오류가 발생하여 쉽게 해결할 수 있지만 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
멤버 에만 액세스 할 수 있습니다 .Derived
Base
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 friend
to 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
'IT TIP' 카테고리의 다른 글
Java를 C # 코드로 변환하는 도구 (0) | 2021.01.08 |
---|---|
OAuth 공급자 용 라이브러리 (Java) (0) | 2021.01.08 |
cv :: normalize (_src, dst, 0, 255, NORM_MINMAX, CV_8UC1); (0) | 2021.01.08 |
C의 int에 long int를 할당하면 어떻게됩니까? (0) | 2021.01.08 |
다른 ASP.NET 캐싱 옵션의 장단점 (0) | 2021.01.08 |