10. Class Inheritance

지니🧸·2023년 2월 28일
0

C++

목록 보기
10/10

본 문서는 인프런의 [하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문 강의를 공부하며 작성한 개인 노트입니다.

🥢 상속 기본

코드는 재활용이 가능해야 한다

상속
1. 기존의 클래스에 새로운 기능 추가 가능
2. 클래스가 나타내고 있는 데이터에 다른 것을 더 추가할 수 있음
3. 클래스 메서드가 동작하는 방식 변경 가능

파생 클래스

(time.h) Time 클래스의 파생클래스 NewTime 클래스

class NewTime : public Time {
private:
	int day;
public:
	NewTime();
    NewTime(int, int, int);
};
  1. 파생 클래스형의 객체 안에는 기초 클래스형의 데이터 멤버들이 저장됨
  2. 파생 클래스형의 객체는 기초 클래스형의 메서드들을 사용할 수 있음
  3. 파생 클래스는 자기 자신의 생성자를 필요로 함
  4. 파생 클래스는 부가적인 데이터 멤버들과 멤버 함수들을 임의로 추가할 수 있음
  5. 파생 클래스는 기초 클래스의 private 멤버에 접근하지 못함

파생 클래스 메서드 정의

func.cpp

NewTime::NewTime() : Time() {
	day = 0;
    // min & hr는 Time()에서 이미 정의됨
}

NewTime::NewTime(int, int, int) : Time(h, m) {
	day = d;
    // 첫 두 매개변수는 h, m으로 결정됨
}
  • : Time(): Time(h, m)을 통해서 각 NewTime 메서드를 호출할 때 Time 객체가 먼저 생성되어 매개변수로 NewTime 메서드에 전달됨

🍽️ Public 다형 상속

기초 클래스 메서드를 상속 클래스에 다시 정의

가상 메서드

기초 클래스의 메서드에 virtual 키워드 추가
(ex) virtual void show();

  • virtual 키워드는 프로그램에게 서로 독립된 두개의 메서드 정의가 있다는 것을 알려줌
  • virtual 키워드가 붙은 메서드가 호출되면 프로그램은 호출한 객체 클래스에 따라 메서드를 선택해서 호출함
  • 기초 클래스에서 가상메서드를 선언하면 그 함수는 기초 클래스 및 파생되는 모든 클래스에서 모두 가상임
  • 동적결합: 객체에 대한 참조 or 객체를 지시하는 포인터를 사용하여 가상 메서드를 호출하면 참조/포인터를 위해 정의된 메서드를 사용하지 않고 객체형을 위해 정의된 메서드를 사용한다
  • 상속을 위해 기초 클래스로 사용할 클래스를 정의할 때 파생 클래스에서 다시 정의해야 되는 클래스 메서드들은 가상 함수로 선언해야 함

🧂 동적 결합

  • Time과 NewTime으로 배열은 만들 수 없음
    • 배열은 같은 클래스의 원소만 포함할 수 있음
  • Time을 지시하는 포인터들의 배열은 만들 수 있음
    • Time과 NewTime은 public 상속모델이 적용되어 있음
    • Time을 지시하는 포인터는 Time과 NewTime 모두 지시할 수 있음
#include<iostream>
#include"time.h"
using namespace std;

const int MAX = 3;

int main() {
	Time* times[MAX]; // 포인터의 배열
    int day; 
    int hours; 
    int mins;
}

delete

  • Time* times 배열에서 원소에 delete 함수를 사용하면 무조건 Time 클래스의 메서드가 사용될 것임
  • delete 함수도 virtual 처리해줘야 함
profile
우당탕탕

0개의 댓글