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-specifier—public,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) — 파생 객체를 기반 객체로 값 복사하면 파생 부분이 잘려요. 기반 참조/포인터로 다뤄야 해요.
- 기반 클래스에 가상 소멸자를 두는 것이 다형적 삭제에 중요해요.