C++객체지향

상속과 virtual 함수

공통 인터페이스를 기반으로 동작을 바꿔 끼우는 C++ 상속과 다형성의 핵심을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

cpp
class Animal {
public:
    virtual void speak() const { std::cout << "...\n"; }
};

설명

  • 상속은 공통 기능을 부모 클래스에 두고, 자식 클래스가 확장하거나 재정의하게 합니다.
  • virtual 함수가 있어야 기반 클래스 포인터나 참조를 통해 다형성이 작동합니다.
  • override는 부모의 가상 함수를 정확히 재정의하고 있다는 의도를 분명히 합니다.
  • 인터페이스 재사용에는 유용하지만, 단순 코드 재사용만을 위해 무분별하게 상속하면 구조가 복잡해집니다.

짧은 예제

cpp
#include <iostream>

class Animal {
public:
    virtual void speak() const { std::cout << "...\n"; }
    virtual ~Animal() = default;
};

class Dog : public Animal {
public:
    void speak() const override { std::cout << "woof\n"; }
};

int main() {
    Animal* pet = new Dog();
    pet->speak();
    delete pet;
}

빠른 정리

항목설명
상속기존 클래스의 인터페이스와 구현을 기반으로 확장
virtual런타임 다형성을 허용
override재정의 의도를 컴파일러에 명시
기반 클래스 포인터여러 자식 타입을 공통 인터페이스로 다룸
가상 소멸자다형적 삭제 시 안전성 확보

주의할 점

다형적으로 사용할 클래스에 가상 소멸자가 없으면 파생 클래스 자원이 제대로 정리되지 않을 수 있습니다.