C++ inheritance

jaeha_lee·2022년 5월 11일
0
class Base{ // Base == Parent 클래스 
	std::string name;
    int age;
};
class Derived1 : public Base{ // Derived==child 클래스 (파생 클래스)
	int id;
};
class Derived2 : public Base{ // Derived 클래스 (파생 클래스)
	int major;
};
int main(){
	Derived1 s;
    Derived2 p;
}
  • 참고
C++ 	: class Student : public Preson
C#		: class Student : Person
Java	: class Student extends Preson
Python	: class Student(Person)
  • C++ 3개의 접근 지정자

    • private : 파생 클래스 멤버 함수에서는 접근 안됨 / 자신의 멤버 함수와 friend 함수에서 접근

    • protected : 파생 클래스 멤버 함수와 friend 함수에서 접근 가능

    • public

    • 예시

      class Base{
      private		: int a;
      protected	: int b;
      public		: int c;
      };
      
      class Derived : public Base{
      public:
          void df(){
              a = 10;// error
              b = 10;// ok
              c = 20;// ok
          }
      };
      
      int main(){
          Derived d;
          d.a = 10; // error
          d.b = 10; // errir
          d.c = 10; // ok
      }

호출 순서

  • Base와 Derived 생성자의 경우 Base 생성자가 먼저 실행 됨

  • 이때 Base 클래스의 디폴트 생성자를 호출한다.

    class Base{
        int data1;
    public:
        Base()		: data1(0) {}
        Base(int a)	: data1(0) {}
        ~Base() {}
    };
    
    class Derived : public Base{
        int data2;
    public:
        Derived()		: data2(0) {}
        Derived(int a)	: data2(a) {}
        ~Derived(){}
    }
    
    Derived d1;
    Derived d2(1); // 이렇게 선언하면 컴파일러가 Derived(1) : Base(), data2(1){}을 호출함.
    // 자동으로 Base의 디폴트 생성자 호출
    // 그렇기 때문에 Base에 디폴트 생성자를 만들어주지 않으면 에러가 발생
    

만약 Base의 디폴트 생성자가 없다면? → Base 클래스의 생성자를 호출하는 코드를 넣어야 함.

class Base{
    int data1;
public:
    // Base()		: data1(0) {} // 이런 식으로 Base의 디폴트 생성자가 없음
    Base(int a)	: data1(0) {} // 얘를 호출해줘야 함.
    ~Base() {}
};
class Derived : public Base{
    int data2; 
public:
    Derived()		: Base(0), data2(0) {} // 이런식으로
    ~Derived(){}
}

0개의 댓글