derive_class — 파생 클래스

derive_class — 파생 클래스 (Derived classes)

**파생 클래스(derived class)**는 기반 클래스(base class)의 멤버를 상속받아 재사용·확장하는 클래스예요. 상속(inheritance)을 통해 코드 재사용과 계층 설계를 구현해요.

기반 클래스의 데이터 멤버와 멤버 함수를 물려받고, 필요하면 오버라이드하거나 새 멤버를 추가해요. 다중 상속(여러 기반)도 가능해요.

출처: cppreference

본문

파생 클래스는 하나 이상의 기반 클래스로부터 상속받아 멤버를 물려받는 클래스예요.

문법 (Syntax)

class Derived : access-specifier Base1, access-specifier Base2, ... { body };
struct Derived : Base { ... };   // struct 는 기본 public
  • access-specifierpublic, protected, private (기본: class는 private, struct는 public)
  • Base1, Base2 — 기반 클래스

상속 접근 지정자

  • public 상속 — 기반의 public이 파생에서 public으로 (가장 흔함, is-a 관계)
  • protected 상속 — 기반의 public이 protected로
  • private 상속 — 기반의 모든 것이 private로 (구현 재사용, has-a)
class Shape {
public:
    virtual double area() const = 0;
};

class Circle : public Shape {   // is-a
    double r;
public:
    Circle(double r) : r(r) {}
    double area() const override { return 3.14159 * r * r; }
};

멤버 상속

파생 클래스는 기반의 public/protected 멤버에 접근할 수 있고, 기반의 생성자(초기화)·소멸자·데이터 멤버·멤버 함수를 가져와요.

생성자/소멸자

  • 파생 생성자는 기반 생성자를 초기화 목록에서 호출해요 (Shape(원본)).
  • 소멸자는 파생 → 기반 순서로 호출돼요.
  • 생성 순서는 기반 → 파생이에요.

가상 함수와 다형성

기반에 virtual 함수를 선언하고 파생에서 override하면, 파생 객체를 기반 포인터/참조로 다뤄도 파생의 구현이 호출돼요. 이를 다형성(polymorphism)이라 해요.

Shape* s = new Circle(2);
s->area();    // Circle::area() 호출

다중 상속

여러 기반에서 상속할 수 있어요. 다이아몬드 문제(공통 기반)는 가상 상속(virtual Base)으로 해결해요.

struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};   // A 를 두 번 상속

노트 (Notes)

  • 슬라이싱(slicing) — 파생 객체를 기반 객체로 값 복사하면 파생 부분이 잘려요. 기반 참조/포인터로 다뤄야 해요.
  • 기반 클래스에 가상 소멸자를 두는 것이 다형적 삭제에 중요해요.

더 알아보기 (Learn more)

cppreference