Kong Eunho

상속

2025년 10월 22일 22시
카테고리 - LECTURE, 객체지향프로그래밍II


객체지향프로그래밍II(김정준) 중간고사 대비 (8장)

C++ 상속

상속의 목적/장점

  1. 간결한 클래스 작성
    기본 클래스의 기능을 물려받아 파생 클래스를 간결하게 작성
  2. 클래스 간의 계층적 분류 및 관리의 용이함
    상속은 클래스들의 구조적 관계 파악 용이
  3. 클래스 재사용과 확장을 통한 소프트웨어 생산성 향상
    빠른 소프트웨어 생산 필요
    기존에 작성한 클래스의 재사용 – 상속받아 새로운 기능을 확장
    앞으로 있을 상속에 대비한 클래스의 객체 지향적 설계 필요

상속 선언

class Person { // 기본 클래스 Person 선언
  int age; // private 변수이므로 Person에서만 접근 가능
public:
  void setAge(int age) { this->age = age; }
  void show() { cout << age; }
};

class Student : public Person { // Person을 상속받는 Student 선언
  double score;
public:
  void setScore(double score) { this->score = score; }
  void showStudent() {
    cout << score << ' : ';
    show(); // 파생 클래스에서 기본 클래스 멤버 호출
  }
};

// Student를 상속받는 Intern 선언
class Intern : public Student { ... };


상속과 객체 포인터 – 업 캐스팅

int main() {
  Student mark;
  Student *pDer = &mark;
  Person *pBase = pDer; // 업 캐스팅

  pDer->setAge(20); // mark의 age를 20으로 설정
  pBase->show(); // 20 출력
  pDer->setScore(4.42); // mark의 score를 4.42로 설정
  pDer->showStudent(); // 4.42 : 20 출력
  pBase->showStudent(); // 컴파일 오류. Person에서 Student의 멤버 접근 불가
}

출력 :
20
4.42 : 20


상속과 객체 포인터 – 다운 캐스팅

int main() {
  Student mark;
  Student *pDer;
  Person *pBase = &mark; // 업 캐스팅

  pBase->setAge(20); // mark의 age를 20으로 설정
  pBase->show(); // 20 출력

  pDer = (Student *)pBase; // 다운 캐스팅
  pDer->setScore(4.42); // mark의 score를 4.42로 설정
  pDer->showStudent(); // 4.42 : 20 출력
}


protected 접근 지정

class Person { // 기본 클래스 Person 선언
protected:
  int age; // protected 변수이므로 파생 클래스 멤버함수까지만 접근 가능
public:
  void setAge(int age) { this->age = age; }
  void show() { cout << age; }
};

class Student : public Person { // Person을 상속받는 Student 선언
  double score;
public:
  void setScore(double score) { this->score = score; }
  void showStudent() {
    cout << score << ' : ';
    cout << age; // protected 변수를 파생 클래스에서 접근
  }
};


상속 관계의 생성자와 소멸자 실행


상속 지정

class Derived : public Base { ... };

class Derived : protected Base { ... };

class Derived : private Base { ... };


다중 상속

class Person {
public:
    int age;
    void eat() { ... }
    void sleep() { ... }
};

class Student : public Person {
protected:
    string studentID;
public:
    void study() { ... }
};

class Employee : public Person {
protected:
    string employeeID;
public:
    void work() { ... }
};

// Intern은 Student와 Employee를 모두 상속
class Intern : public Student, public Employee { // 다중 상속 선언
public:
    Intern(int age, string& sID, string& eID) {
        this->age = age; // Person으로부터 상속, 모호성 발생
        this->studentID = sID; // Student로부터 상속
        this->employeeID = eID; // Employee로부터 상속
    }
};

int main() {
  Intern Bob(24, "2024E7403", "20253047"); // 모호성으로 24 전달 불가
  while(true) {
    Bob.eat(); // Person으로부터 상속, 모호성 발생
    Bob.study(); // Student로부터 상속
    Bob.work(); // Employee로부터 상속
    Bob.sleep(); // Person으로부터 상속, 모호성 발생
  }
}


다중 상속의 문제점


가상 상속

class Person { ... };

// 가상 상속
class Student : virtual public Person { ... };

// 가상 상속
class Employee : virtual public Person { ... };

// 가상 상속을 통해 공통의 Person 기본 클래스를 한 번만 포함
class Intern : public Student, public Employee { ... };
◀ 이전 글 LECTURE, 객체지향프로그래밍II
프렌드와 연산자 중복
2025-10-22
목록으로 다음 글 ▶ LECTURE, 객체지향프로그래밍II
중간고사 예상문제
2025-10-23