답변:
개인 멤버는 자신을 정의하는 클래스 내에서만 액세스 할 수 있습니다.
보호 된 멤버는 멤버를 정의하는 클래스와 해당 클래스에서 상속 된 클래스에서 액세스 할 수 있습니다.
편집 : 둘 다 클래스의 친구들과 보호 멤버의 경우 파생 클래스의 친구들도 액세스 할 수 있습니다.
편집 2 : 문제의 맥락에서 의미가있는 것을 사용하십시오. 커플 링을 줄이고 기본 클래스의 구현을 보호 할 수있을 때마다 멤버를 비공개로 만들어야하지만 불가능한 경우 보호 멤버를 사용하십시오. 문제를 더 잘 이해하려면 C ++ FAQ 를 확인하십시오 . 보호 변수에 대한이 질문 도 도움이 될 수 있습니다.
클래스 A의 공개 멤버는 모든 사람과 누구나 액세스 할 수 있습니다.
클래스 A의 보호 된 멤버는 A 코드 외부에서 액세스 할 수 없지만 A에서 파생 된 모든 클래스의 코드에서 액세스 할 수 있습니다.
클래스 A의 개인 멤버는 A의 코드 외부에서 또는 A에서 파생 된 클래스의 코드에서 액세스 할 수 없습니다.
따라서 결국 보호 또는 개인 중 하나를 선택하면 다음과 같은 질문에 대답 할 수 있습니다. 파생 클래스의 프로그래머에게 어느 정도의 신뢰를 기꺼이 하시겠습니까?
기본적으로 파생 클래스를 신뢰할 수 없다고 가정하고 멤버를 비공개로 만듭니다. 파생 클래스에 어머니 클래스의 내부를 무료로 액세스 할 수있는 충분한 이유가 있다면 보호받을 수 있습니다.
the protected data of the base class is part of the data of the derived class.
참으로. 그렇다면 파생 클래스의 작성자가 내 데이터 대신 클래스의 데이터를 선언하도록하는 것이 낫지 않습니까? ... :-) ... The writer of the derived class is expected to handle this data properly or it is a bug.
NVI 패턴의 목표는 모든 것을 비공개로 만드는 것입니다. 파생 클래스 작성기의 계층 구조 손상을 제한하기 위해 보호 된 방법은 이미 잠재적 인 문제입니다. 보호 된 상태를 사용하여 이것을 악화시키는 것이 올바른 접근법이라고 확신하지 않습니다.
보호 된 멤버는 파생 클래스에서 액세스 할 수 있습니다. 개인은 할 수 없습니다.
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
};
"모범 사례"에 따라 다릅니다. 누군가 기존 클래스에서 새 클래스를 파생시키고 내부 멤버에게 액세스해야 할 가능성이 희박한 경우에도 비공개가 아닌 보호로 설정하십시오. 비공개 인 경우 수업을 쉽게 상속받지 못할 수 있습니다.
그것은 모두 당신이하고 싶은 것과 파생 클래스가 볼 수있는 것에 달려 있습니다.
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 처럼)으로 사용하는 것이 좋습니다 . 보호 된 멤버 변수는 항상 나쁜 생각입니다. 예를 들어 템플릿 메소드 패턴에 보호 된 멤버 함수를 사용할 수 있습니다.
보호 된 멤버는 클래스의 자손과 동일한 모듈의 코드를 통해서만 액세스 할 수 있습니다. 비공개 멤버는 선언 된 클래스 및 동일한 모듈의 코드를 통해서만 액세스 할 수 있습니다.
물론 친구 기능은 이것을 창 밖으로 던져 버립니다.
비공개 멤버는 클래스 내에서만 액세스 할 수 있고 보호 멤버는 클래스 및 파생 클래스에서 액세스 할 수 있습니다. OO 언어의 상속 기능입니다.
상속 계층에서 액세스 할 수있는 파생 클래스를 결정하는 C ++에서 개인, 보호 및 공용 상속을 가질 수 있습니다. 예를 들어 C #에는 공용 상속 만 있습니다.
파생 클래스에서 보호 된 멤버를 가져오고 업데이트하는 데 공용 멤버 함수가 필요하지 않기 때문에 코드의 효율성이 향상되고 작성해야하는 코드의 양이 줄어 듭니다. 그러나 파생 클래스의 프로그래머는 자신이하는 일을 알고 있어야합니다.
private
회원 데이터에 선호됩니다. C ++ 클래스의 멤버는private
기본적으로입니다.
public
의견의 문제이지만 회원 기능에 선호됩니다. 최소한 일부 메소드에 액세스 할 수 있어야합니다. public
모든 사람이 이용할 수 있습니다. 가장 유연한 옵션이며 가장 안전하지 않습니다. 누구나 사용할 수 있고 누구나 잘못 사용할 수 있습니다.
private
전혀 접근 할 수 없습니다. 수업 밖에서도 사용할 수 없으며 오용 할 수 없습니다. 파생 클래스에는 없습니다.
protected
파생 클래스에서 사용할 수 있기 때문에 타협입니다. 클래스에서 파생 될 때 기본 클래스에 대해 잘 이해하고 있으며 이러한 멤버를 오용하지 않도록주의해야합니다.
MFC 그것은 선호, 윈도우 API를위한 C ++ 래퍼 public
와 protected
. Visual Studio 마법사에 의해 생성 된 클래스 protected
에는 public
, 및 private
멤버가 혼합되어 있습니다. 그러나 MFC 클래스 자체에는 몇 가지 논리가 있습니다.
같은 회원 SetWindowText
은 public
종종 이러한 회원에게 액세스해야하기 때문입니다.
와 같은 멤버 OnLButtonDown
는 창에서 수신 한 알림을 처리합니다. 액세스해서는 안되므로 protected
. 파생 클래스에서 계속 액세스하여 이러한 함수를 재정의 할 수 있습니다.
일부 멤버는 스레드 및 메시지 루프를 수행해야하며 액세스하거나 재정의해서는 안되므로 다음과 같이 선언됩니다. private
C ++ 구조에서 public
기본적으로 멤버가 있습니다. 구조체는 일반적으로 메서드가 아닌 데이터에만 사용되므로 public
선언은 안전한 것으로 간주됩니다.
private
. 기본적으로 Visual Studio에 있습니다. 그것은이다 private
그것은 결코뿐만 아니라 GCC에서 기본적으로 public
기본적으로. 내가 다시 틀리지 않는 한. 당신이 말하는 표준을 찾을 수 없습니다.
Private : 액세스 지정자입니다. 기본적으로 인스턴스 (멤버) 변수 또는 c ++ / java 클래스의 메소드는 개인용입니다. 상속하는 동안 코드와 데이터는 항상 상속되지만 클래스 외부에서는 액세스 할 수 없습니다. 데이터 멤버를 비공개로 선언하면 아무도 멤버 변수를 직접 변경할 수 없으며 비공개 멤버를 변경하기 위해 공개 게터 및 세터를 제공 할 수 있습니다. 이 개념은 항상 비즈니스 규칙에 적용됩니다.
보호됨 : 액세스 지정자이기도합니다. C ++에서 보호 된 멤버는 클래스 내에서 상속 된 클래스에 액세스 할 수 있지만 클래스 외부에서는 액세스 할 수 없습니다. Java에서 보호 된 멤버는 클래스 내, 상속 된 클래스 및 동일한 패키지 내의 모든 클래스에 액세스 할 수 있습니다.
개인 : 클래스 멤버 기능 및 친구 기능 또는 친구 클래스에서 액세스 할 수 있습니다. C ++ 클래스의 경우 이것이 기본 액세스 지정자입니다.
보호 : 클래스 멤버 함수, 친구 함수 또는 친구 클래스 및 파생 클래스에서 액세스 할 수 있습니다.
자세한 내용은이 링크 를 참조하십시오 .
개인 및 보호 된 액세스 수정자는 기본 클래스의 보호 된 멤버가 하위 (파생) 클래스의 기본 클래스 범위 밖에서 액세스 할 수있는 유일한 것입니다. 또한 상속에도 동일하게 적용됩니다. 그러나 전용 수정자를 사용하면 기본 클래스의 멤버는 기본 클래스의 범위 또는 코드에서만 액세스 할 수 있으며 그 친구 기능 만 가능합니다 '' ''