누군가 수업 시간에 회원 private
과 의 차이점에 대해 깨달을 수 있습니까 protected
?
모범 사례 규칙에서 클래스 외부에서 호출되지 않은 변수와 함수를 만들어야 private
하지만 내 MFC 프로젝트를 보면 MFC 가 선호하는 것으로 알고 있습니다 protected
.
차이점은 무엇이고 어떤 것을 사용해야합니까?
답변
개인 멤버는 자신을 정의하는 클래스 내에서만 액세스 할 수 있습니다.
보호 된 멤버는 멤버를 정의하는 클래스와 해당 클래스에서 상속 된 클래스에서 액세스 할 수 있습니다.
편집 : 둘 다 클래스의 친구들과 보호 멤버의 경우 파생 클래스의 친구들도 액세스 할 수 있습니다.
편집 2 : 문제의 맥락에서 의미가있는 것을 사용하십시오. 커플 링을 줄이고 기본 클래스의 구현을 보호 할 수있을 때마다 멤버를 비공개로 만들어야하지만 불가능한 경우 보호 멤버를 사용하십시오. 문제를 더 잘 이해하려면 C ++ FAQ 를 확인하십시오 . 보호 변수에 대한이 질문 도 도움이 될 수 있습니다.
답변
클래스 A의 공개 멤버는 모든 사람과 누구나 액세스 할 수 있습니다.
클래스 A의 보호 된 멤버는 A 코드 외부에서 액세스 할 수 없지만 A에서 파생 된 모든 클래스의 코드에서 액세스 할 수 있습니다.
클래스 A의 개인 멤버는 A의 코드 외부에서 또는 A에서 파생 된 클래스의 코드에서 액세스 할 수 없습니다.
따라서 결국 보호 또는 개인 중 하나를 선택하면 다음과 같은 질문에 대답 할 수 있습니다. 파생 클래스의 프로그래머에게 어느 정도의 신뢰를 기꺼이 하시겠습니까?
기본적으로 파생 클래스를 신뢰할 수 없다고 가정하고 멤버를 비공개로 만듭니다. 파생 클래스에 어머니 클래스의 내부를 무료로 액세스 할 수있는 충분한 이유가 있다면 보호받을 수 있습니다.
답변
보호 된 멤버는 파생 클래스에서 액세스 할 수 있습니다. 개인은 할 수 없습니다.
class Base {
private:
int MyPrivateInt;
protected:
int MyProtectedInt;
public:
int MyPublicInt;
};
class Derived : Base
{
public:
int foo1() { return MyPrivateInt;} // Won't compile!
int foo2() { return MyProtectedInt;} // OK
int foo3() { return MyPublicInt;} // OK
};
class Unrelated
{
private:
Base B;
public:
int foo1() { return B.MyPrivateInt;} // Won't compile!
int foo2() { return B.MyProtectedInt;} // Won't compile
int foo3() { return B.MyPublicInt;} // OK
};
“모범 사례”에 따라 다릅니다. 누군가 기존 클래스에서 새 클래스를 파생시키고 내부 멤버에게 액세스해야 할 가능성이 희박한 경우에도 비공개가 아닌 보호로 설정하십시오. 비공개 인 경우 수업을 쉽게 상속받지 못할 수 있습니다.
답변
MFC가 보호를 선호하는 이유는 그것이 프레임 워크이기 때문입니다. MFC 클래스를 서브 클래스로 만들려는 경우 클래스의 일반적인 용도로는 보이지 않는 메소드에 액세스하려면 보호 된 인터페이스가 필요합니다.
답변
그것은 모두 당신이하고 싶은 것과 파생 클래스가 볼 수있는 것에 달려 있습니다.
class A
{
private:
int _privInt = 0;
int privFunc(){return 0;}
virtual int privVirtFunc(){return 0;}
protected:
int _protInt = 0;
int protFunc(){return 0;}
public:
int _publInt = 0;
int publFunc()
{
return privVirtFunc();
}
};
class B : public A
{
private:
virtual int privVirtFunc(){return 1;}
public:
void func()
{
_privInt = 1; // wont work
_protInt = 1; // will work
_publInt = 1; // will work
privFunc(); // wont work
privVirtFunc(); // wont work
protFunc(); // will work
publFunc(); // will return 1 since it's overridden in this class
}
}
답변
protected
비공개 로 표시된 속성과 메소드는 여전히 서브 클래스에 표시됩니다.
가능한 서브 클래스에서 메소드를 대체 할 가능성을 사용하거나 제공하지 않으려는 경우,이를 작성합니다 private
.
답변
보호 멤버 변수 질문을 살펴보십시오 . class
커플 링을 줄이려면 private을 기본값 (C ++ ses 처럼)으로 사용하는 것이 좋습니다 . 보호 된 멤버 변수는 항상 나쁜 생각입니다. 예를 들어 템플릿 메소드 패턴에 보호 된 멤버 함수를 사용할 수 있습니다.