<객체> 8. 상속

정지민·2023년 11월 3일
0

객체 프로그래밍

목록 보기
7/11

상속

기본 클래스 - 부모 클래스 - 상속해주는
파생 클래스 - 자식 클래스 - 상속받는

  • 파생클래스로 갈수록 구체화됨

상속 선언

class 파생클래스명 접근지정 기본클래스명
class Student : public Person {}
class StudentWorker : public Student {}
StudentWorker는 Student물려받고, Student는 Person물려받음

업캐스팅

파생 클래스의 포인터가 기본 클래스 포인터에 치환됨

ColorPoint cp;
ColorPoint *pDer = &cp;
Point* pBase = pDer; //업캐스팅
  • pDer 포인터로 객체 cp의 모든 public멤버 접근 가능
  • pBase 포인터로 기본 클래스의 public 멤버만 접근 가능

다운캐스팅

기본 클래스의 포인터가 파생 클래스의 포인터에 치환됨

ColorPoint cp;
ColorPoint *pDer = &cp;
Point* pBase = pDer; //업캐스팅
pDer = (ColorPoint*)pBase; //다운캐스팅
  • pDer 포인터로 객체 cp의 모든 public멤버 접근 가능
  • pBase 포인터로 기본 클래스의 public 멤버만 접근 가능

protected 접근지정자

  • 선언된 클래스에서 접근 가능
  • 파생 클래스에서만 접근 허용

파생클래스 생성자, 소멸자

  • 파생클래스 객체 생성시 : 기본 클래스 생성자 실행 -> 파생 클래스 생성자 실행

  • 소멸될때 : 파생클래스 -> 기본 클래스 순서

  • 파생클래스 생성자에서 기본클래스 기본생성자 묵시적 호출됨

  • 기본 클래스에서 기본 생성자가 없는 경우 컴파일 오류 발생

  • 매개 변수 가진 파생 클래스 생성자는 묵시적으로 기본 클래스 기본 생성자 호출

  • 파생클래스 생성자에서 명시적으로 기본클래스 인수있는 생성자 선택
    B(int x) : A(x+3) {}

상속 지정

public - 기본 클래스 멤버 속성 그대로
private - private로
protected - protected으로

다중 상속

class MusicPhone : public MP3, public MobilePhone{}

문제점

class BaseIO{};
calss In : public BaseIO{};
class Out : public BaseIO{};
clas InOut : public In, public Out{};
  • Base의 멤버가 이중으로 객체에 삽입
  • 동일한 x에 접근하는 프로그램이 서로 다른 x에 접근하는 결과 낳음

해결 : 가상상속

  • 파생 클래스의 선언문에서 기본 클래스 앞에 virtual 선언
  • 파생 클래스의 객체가 생성될 때 기본 클래스의 멤버는 오직 한번만 생성

class In : virtual public BaseIO{}

0개의 댓글