C++ 프로그래밍/기초 문법

[C++ 기초 문법] 상속(Inheritance) 기본, 파생 클래스

SW Developer 2024. 2. 16. 00:38

상속(Inheritance) 기본, 파생 클래스

 

상속(Inheritance)?

① 기존의 클래스에 새로운 기능을 추가할 수 있다
② 클래스가 나타내고 있는 데이터에 다른 것을 더 추가할 수 있다
③ 클래스 메서드가 동작하는 방식을 변경할 수 있다

 

[time.h]

#include <iostream>
#ifndef TIMEH
#define TIMEH

class Time //기초 클래스
{
    private:
        int hours;
        int mins;
    public:
        Time();
        Time(int, int);
        void addHours(int);
        void addMins(int);
        Time sum(Time&); //Time 클래스를 return하는 함수 sum의 원형 제공
        void show();
        ~Time();
};

#endif

 

위 헤더파일에 상속을 활용하여 NewTime이라는 *파생클래스를 추가한 후, Time 멤버에 day를 추가해보자!

 

 

※ 파생 클래스란?

① 파생 클래스형의 객체 안에는 기초 클래스형의 데이터 멤버들이 저장된다

② 파생 클래스형의 객체는 기초 클래스형의 메서드들을 사용할 수 있다

③ 파생 클래스는 자기 자신의 생성자를 필요로 한다

④ 파생 클래스는 부가적인 데이터 멤버들과 멤버 함수들을 임의로 추가할 수 있다

 

 

헤더파일에 NewTime 파생클래스 추가하기

class NewTime : public Time { //파생 클래스 (상속)
    private:
        int day;//NewTime 파생클래스:+day

    public:
        NewTime();//default 생성자
        NewTime(int, int, int);//Time 클래스 생성자에 멤버 day 추가
        void print();//NewTime 출력함수 print()
};

 

[func.cpp]에 NewTime 파생클래스의 생성자에 대한 정의 추가하기 (기존 Time 클래스 활용)

NewTime::NewTime() : Time() {//멤버 초기자 리스트 문법
	//hours = mins = 0; 이라는 Time 클래스의 default 생성자를 직접적으로 포함시킴
	day = 0;//추가되는 멤버 day에 대한 default값만을 초기화
}

NewTime::NewTime(int h, int m, int d) : Time(h,m) {
	day = d;
}

void NewTime::print() {//NewTime 클래스의 출력함수는 별도로 정의
	cout << "일 : " << day << endl;
	show();//파생클래스에 Time클래스의 출력함수를 직접적으로 포함시킬 수 있다
}

 

main 코드 작성하기

int main()
{
    NewTime temp1();//NewTime default 생성자로 ()을 넣어 temp1 선언
    NewTime temp2;  //NewTime default 생성자로 () 없이 temp2 선언
    NewTime temp3(3, 30, 2);//NewTime 생성자로 temp3 초기화

    temp1.print(); //출력 Error
    temp2.print(); //정상출력
    temp3.print(); //정상출력
    
    /*
    일 : 0
    시간 : 0
    분 : 0
    
    일 : 2
    시간 : 3
    분 : 30
    */

    return 0;
}

 

※ default 생성자 선언 시 ( ) 을 넣는 것과 안 넣는 것의 차이

- ( ) 있을 때: 선언은 하지만 값을 대입은 하지 않은 "빈 상태"의 클래스

- ( ) 없을 때: 사전에 초기화한 default 값을 대입한, 말 그대로 default 상태의 클래스

(사내개발자 선생님께서 알려주신 꿀팁입니다... 감사합니다 ^^)

 

 

※ 해당 게시글은 개인 학습의 목적으로, 아래 강의를 수강한 후 정리한 학습노트입니다.

https://inf.run/pypW