Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

IT Language 연습실

상속(2) 본문

C++

상속(2)

akongman 2024. 2. 13. 20:02
class employee {  //고용 클래스  
    const char *name;
    public :
    employee(const char *name) :name(name) {}
    
    void name_show() { 
        cout<<name<<endl;
    }
};

class permanent_worker : public employee { //정규직 클래스
    int salary;
    public : 
    permanent_worker(const char *name, int pay) :employee(name), salary(pay) {}

 

위 코드들을 들고 왔다. 위 코드들은 나중 코드를 분석할 예제중 하나이며 지금 보이는 코드는 일부분에 불과하다

일부분에 불과한 코드를 왜 들고 왔냐면 

상속받은 해당 클래스의 멤버는 해당 클래스의 생성자를 통한 초기화가 가능하다는 사실을 보여주기 위해서이다.

permanent_worker 라는 클래스는 employee 클래스로부터 상속 받고 있다.

그리고 permanent_worker의 생성자는 main으로부터 값을 입력 받고 있다는 사실 또한 추측할 수 있고

문자열과 정수형을 입력 받고 있는데 이를 초기화 하는 과정에서 이니셜라이져를 사용하고 있다.

 

그런데 employee 생성자를 호출하여 입력받은 name의 값을 전달하고  employee 생성자는 name을 전달 받아

전달 받은 name을 자신의 멤버변수로 초기화하는 작업을 거치고 있다. 라는 문법적으로 가능함을 보여주고 싶었다.

앞으로 이러한 형태로 많이 사용할 것임을 알린다.

 

하나 더 말해주고 싶은 것이 있다.

상속 관계에서 상속을 받는 클래스와 상속을 시키는 클래스를 부르는 명칭을 좀 정리해봤다. 

 

부모 클래스  ------ 자식 클래스

기초 클래스 ------- 유도 클래스

슈퍼 클래스 -------- 서브 클래스

상위 클래스 ------- 하위 클래스

 

왼쪽은 상속을 시키는 클래스를 부르는 용어들이고 오른쪽은 상속을 받는 클래스를 의미한다.

앞으로는 기초 클래스 유도클래스 혹은 부모 클래스 자식 클래스라고 상속 관계에 대해서 말하겠다.

------------------------- ------------------------- ------------------------- ------------------------- ------------------------- 

#include <iostream>
using namespace std;

class A { 
    int num;
    public : 
    A() :num(20){cout<<"기초클래스 생성자 호출 성공"<<endl;}
   
    void A_show() { 
        cout<<num<<endl;
    }
};

class B :public A { 
   int num;
   public :
   B() :num(30){cout<<"유도클래스 생성자 호출 성공"<<endl;}
   
   void show() { 
       A_show();
       cout<<num<<endl;
   }
};

int main() { 
   B ab;
   ab.show();
}

 

위 코드를 분석해보자 어떤 결과를 예상하는가? 

1) 유도클래스 생성자 호출 성공, 0, 30

2) 기초클래스 생성자 호출 성공, 유도클래스 생성자 호출 성공, 20, 30 

 

1번인가 2번인가? 

 

놀랍겠도 2번의 case로 결과가 출력이 된다.

객체를 생성했고 생성한 과정에서 생성된 객체는 유도 클래스의 객체뿐이 없는데 어째서 기초 클래스까지 호출된 것인가?

기초 클래스의 생성자는 무조건 호출되는 방식이다. 기초 클래스의 객체 생성 여부에 상관없이

유도 클래스의 객체가 생성되는 것 만으로도 기초 클래스의 생성자는 호출되게된다.

그 이유는 클래스 생성자 호출을 명시하지 않았다면 디폴트 생성자가 호출되기 때문이다. 

-------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- --------

'C++' 카테고리의 다른 글

cout, endl, cin의 정체  (0) 2024.02.17
상속(3)  (0) 2024.02.13
상속(1)  (0) 2024.02.13
C언어 기반의 C++ (2)  (0) 2024.01.29
C언어 기반의 C++ (1)  (0) 2024.01.28