2019년 12월 1일 일요일

c++ - 생성자 상속, 상속 지정




●생성자 상속
클래스를 상속한 전제에서 생성자도 상속이 가능하다.
생성자 상속은 따로 선언을 해줘야한다.

Ex)
B(int x, int y) : A(x+5)
C(int x, int y, int z) : B(x,y)


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <iostream>

using namespace std;

class A {

 int x;

public:
  A() {
    x = 0;
}

  A(int x) {
     this->x = x;
     cout << x << endl;
  }
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class B : public A {

int y;


public:

     B(int x, int y) : A(x+5) // A 생성자 상속
    {
        this->y = y;
        cout << y << endl;
    }
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


class C : public B {


int m;

public:

    C(int x, int y, int z) : B(x,y) //B 생성자 상속
   {
        m = x*y*z; cout << m << endl;
    }
};

int main()
{
    C c(3,5,2);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////






◆실행결과
8
5
30




※실행과정여기서 재밌는 점은 main 에서 C class의 객체 c를 생성 인자는 (3,5,2)를 받게 된다.m = 3*5*2, m 출력상속한 생성자를 실행 B(x,y) 호출,y = 2, y 출력B(x,y)가 상속한 생성자 A(x+5) 호출,x = 3 +5, x 출력


※헷갈리기 쉬운건 생성자 뒤에 아무것도 설정 안해준다면 기본 생성자가 호출된다.
ex code)

class A{
    A()
   {
        cout << "a 생성자" << endl;
   } 

    A( int x )
   {
        cout << "a 생성자 : " <<  x << endl;
   }
};


class B : class A{
   B()
  {
       cout << "b 생성자" << endl;
  }

   B( int x )
   {
        cout << "b 생성자 : " <<  x << endl;
   }

};

int main()
{
  B b(1);
}




◆실행결과
a 생성자
b 생성자 : 1



●상속 지정(public 상속, private 상속, protected 상속)

상속 선언시 public, private, protected의 3가지 중 하나 지정기본 클래스의 멤버의 접근 속성을 어떻게 계승할지 지정

public : 기본 클래스의 protected, public 멤버 속성을 그대로 계승
private는 private로 public은 public으로 계승

class Derived : public Base
{
     //anything
}



출처 : https://m.blog.naver.com/cory_kim/220860897856