산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 상속 접근 지정자: public, protected, private 완벽 이해

C++ public, protected, private 상속

이 튜토리얼에서는 예제를 통해 C++에서 public, protected, private 상속을 사용하는 방법을 학습합니다.

소개

C++ 상속에서 자식 클래스를 기반 클래스로부터 다양한 접근 모드로 파생할 수 있습니다. 예를 들어:

class Base {
    .... ... ....
};
class Derived : public Base {
    .... ... ....
};

코드에서 public 키워드를 주목하세요.

class Derived : public Base

이는 기반 클래스로부터 public 모드로 파생 클래스를 생성했음을 의미합니다. 또는 protected 또는 private 모드로 클래스를 파생할 수도 있습니다.

이 3개의 키워드(public, protected, private)를 C++ 상속에서 접근 지정자라고 합니다.


C++에서 public, protected, private 상속

public, protected, private 상속의 특징은 다음과 같습니다:

참고: 기반 클래스의 private 멤버는 파생 클래스에서 접근할 수 없습니다.

class Base {
public:
    int x;
protected:
    int y;
private:
    int z;
};
class PublicDerived: public Base {
    // x는 public
    // y는 protected
    // z는 PublicDerived에서 접근 불가
};
class ProtectedDerived: protected Base {
    // x는 protected
    // y는 protected
    // z는 ProtectedDerived에서 접근 불가
};
class PrivateDerived: private Base {
    // x는 private
    // y는 private
    // z는 PrivateDerived에서 접근 불가
}

예제 1: C++ public 상속

// C++ public 상속의 작동을 보여주는 프로그램
#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;
protected:
    int prot = 2;
public:
    int pub = 3;
    // private 멤버 접근 함수
    int getPVT() {
        return pvt;
    }
};

class PublicDerived : public Base {
public:
    // Base의 protected 멤버 접근 함수
    int getProt() {
        return prot;
    }
};

int main() {
    PublicDerived object1;
    cout << "Private = " << object1.getPVT() << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.pub << endl;
    return 0;
}

출력

Private = 1
Protected = 2
Public = 3

여기서 PublicDerived를 Base로부터 public 모드로 파생했습니다.

결과적으로 PublicDerived에서:

private과 protected 멤버는 main()에서 직접 접근할 수 없으므로 getPVT()와 getProt() 같은 public 함수를 만들어 접근해야 합니다:

// 오류: "Base::pvt" 멤버에 접근 불가
cout << "Private = " << object1.pvt;
// 오류: "Base::prot" 멤버에 접근 불가
cout << "Protected = " << object1.prot;

getPVT() 함수는 Base 내부에 정의되었지만 getProt() 함수는 PublicDerived 내부에 정의되었음에 주목하세요.

이는 pvt가 Base에서 private이므로 PublicDerived에서 접근할 수 없기 때문입니다.

그러나 prot는 public 상속으로 인해 PublicDerived에서 접근 가능하므로 getProt()가 PublicDerived 내부에서 protected 변수에 접근할 수 있습니다.


public 상속에서의 접근성

접근성private 멤버protected 멤버public 멤버
기반 클래스YesYesYes
파생 클래스NoYesYes

예제 2: C++ protected 상속

// C++ protected 상속의 작동을 보여주는 프로그램
#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;
protected:
    int prot = 2;
public:
    int pub = 3;
    // private 멤버 접근 함수
    int getPVT() {
        return pvt;
    }
};

class ProtectedDerived : protected Base {
public:
    // Base의 protected 멤버 접근 함수
    int getProt() {
        return prot;
    }
    // Base의 public 멤버 접근 함수
    int getPub() {
        return pub;
    }
};

int main() {
    ProtectedDerived object1;
    cout << "Private cannot be accessed." << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.getPub() << endl;
    return 0;
}

출력

Private cannot be accessed.
Protected = 2
Public = 3

여기서 ProtectedDerived를 Base로부터 protected 모드로 파생했습니다.

결과적으로 ProtectedDerived에서:

알다시피 protected 멤버는 클래스 외부에서 직접 접근할 수 없습니다. 따라서 ProtectedDerived에서 getPVT()를 사용할 수 없습니다.

이 때문에 ProtectedDerived에서 pub 변수에 접근하기 위해 getPub() 함수를 만들어야 했습니다.

// 오류: "Base::getPVT()" 멤버에 접근 불가
cout << "Private = " << object1.getPVT();
// 오류: "Base::pub" 멤버에 접근 불가
cout << "Public = " << object1.pub;

protected 상속에서의 접근성

접근성private 멤버protected 멤버public 멤버
기반 클래스YesYesYes
파생 클래스NoYesYes (protected 변수로 상속됨)

예제 3: C++ private 상속

// C++ private 상속의 작동을 보여주는 프로그램
#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;
protected:
    int prot = 2;
public:
    int pub = 3;
    // private 멤버 접근 함수
    int getPVT() {
        return pvt;
    }
};

class PrivateDerived : private Base {
public:
    // Base의 protected 멤버 접근 함수
    int getProt() {
        return prot;
    }
    // Base의 public 멤버 접근 함수
    int getPub() {
        return pub;
    }
};

int main() {
    PrivateDerived object1;
    cout << "Private cannot be accessed." << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.getPub() << endl;
    return 0;
}

출력

Private cannot be accessed.
Protected = 2
Public = 3

여기서 PrivateDerived를 Base로부터 private 모드로 파생했습니다.

결과적으로 PrivateDerived에서:

알다시피 private 멤버는 클래스 외부에서 직접 접근할 수 없습니다. 따라서 PrivateDerived에서 getPVT()를 사용할 수 없습니다.

이 때문에 PrivateDerived에서 pub 변수에 접근하기 위해 getPub() 함수를 만들어야 했습니다.

// 오류: "Base::getPVT()" 멤버에 접근 불가
cout << "Private = " << object1.getPVT();
// 오류: "Base::pub" 멤버에 접근 불가
cout << "Public = " << object1.pub;

private 상속에서의 접근성

접근성private 멤버protected 멤버public 멤버
기반 클래스YesYesYes
파생 클래스NoYes (private 변수로 상속됨)Yes (private 변수로 상속됨)

C 언어

  1. 올바른 클라우드 전략 선택: 퍼블릭, 프라이빗, 하이브리드 솔루션 완벽 해설
  2. 퍼블릭 클라우드: 이점, 위험, 핵심 고려사항 완벽 가이드
  3. 프라이빗 클라우드: 장단점과 비즈니스 데이터 보호 방식
  4. C++ 변수, 리터럴, 상수 마스터하기: 종합 가이드
  5. C++ 클래스와 객체: 객체지향 프로그래밍 실전 가이드
  6. C++ 메모리 관리 마스터: new와 delete 전문가 활용법
  7. C++ 프렌드 함수와 프렌드 클래스: 접근 제어 마스터하기
  8. C++ 구조체 vs 클래스: 임베디드 개발자를 위한 실용 가이드
  9. 시그폭스(Sigfox), 프라이빗 에리어 네트워크 출시·지오로케이션 강화·IoT 솔루션 확장
  10. C++ 구조체 vs 클래스: 핵심 차이, 문법, 최적 사용 사례