Programming Language/C++

[C++] 상속(Inheritance)과 접근제어(Access Control)

lumana 2024. 6. 27. 17:52

상속과 접근제어

상속(Inheritance)

  • 부모가 자식에게 상속하면, 부모의 멤버들을 전부 사용하고, 자식만의 고유한 멤버를 추가로 가질 수 있다

  • 포함관계 : 부모가 자식을 포함하는 관계

    • 남자 ) 총각 이듯이 부모 ) 자식이다.

    • 자식이 부모한테 포함되는거고, 부모의 멤버가 자식의 멤버에 포함되는 것이다.

#include <iostream>
using namespace std;

class Base {
   public:
    void bFunc() {
        cout << "Hello!" << endl;
    }
    int bNum;
};
  • 자식 클래스(파생 클래스) 뒤에 콜론 ":"을 붙인 뒤 접근제어자와 부모 클래스를 적어준 뒤 선언하면 된다
class Derived : public Base {  // Base를 부모로 하는 클래스
   public:
    void dFunc() {
        cout << "Hello?" << endl;
    }
    int dNum;
};

int main(void) {
    Base b;
    Derived d;

    b.bFunc();
    b.bNum = 1;

    d.bFunc();
    d.bNum = 2;
    d.dFunc();
    d.dNum = 3;
}

접근 제어

  • 접근 제어 지시자

    • private : 클래스 내부에서만 접근 가능. 클래스 외부에서는 접근 불가

    • public : 클래스 내부, 외부에서 모두 접근 가능

      • 그리고 자식 클래스에서의 접근 제어를 위해서 protected 라는게 등장한다

      • public : 외부 접근 O 자식클래스 o

      • protected : 외부 접근 x 자식클래스 o

      • private : 외부 접근 x 자식클래스x

#include <iostream>
using namespace std;

class Base {
   public:
    int bPublic;

   protected:
    int bProtected;

   private:
    int bPrivate;
};

class Derived : public Base {  // 왜 public을 붙이는지는 아래에서 다룸
   public:
    int dPublic;
    void DFunc() {
        bPublic = 1;
        bProtected = 2;
        // bPrivate는 접근이 불가능함.
        dPublic = 4;
        dPrivate = 5;
    }

   private:
    int dPrivate;
};
  • bPrivate는 부모에서 private로 선언되어 접근이 불가능함

  • 부모 클래스의 private을 제외하곤 자식 클래스에서 접근이 가능하다

int main(void) {
    Base b;
    Derived d;

    b.bPublic = 1;
    // b.bProtected X
    d.bPublic = 1;
    // d.bPrivate, d.bProtected x
    d.dPublic = 1;
}
  • 이 부분을 다시 살펴보자
class Derived : public Base {  // Protected Base의 경우 Protected 보다 더 공개된 멤버들을 Protected 공개수준으로 낮춤.
                               // Private Based의 경우 public이랑 protected 가 privated 공개수준으로 바뀜.
  • 자식이 public으로 상속 받으면 부모의 public을 public 그대로 상속받는다.

    • 부모의 protected와 private는 자식에게 동일하게 protected, private로 상속된다

    • 일반적으로 대부분 경우 public으로 상속을 받음

  • 자식이 protected으로 상속 받으면 부모의 public을 protected 수준으로 상속받는다.

  • 자식이 private으로 상속 받으면 부모의 public, protected를 private 수준으로 상속받는다.