개인 및 보호 회원 : C ++ 외부에서 호출되지 않은

누군가 수업 시간에 회원 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 처럼)으로 사용하는 것이 좋습니다 . 보호 된 멤버 변수는 항상 나쁜 생각입니다. 예를 들어 템플릿 메소드 패턴에 보호 된 멤버 함수를 사용할 수 있습니다.