기본 패턴
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 | 재정의 의도를 컴파일러에 명시 |
| 기반 클래스 포인터 | 여러 자식 타입을 공통 인터페이스로 다룸 |
| 가상 소멸자 | 다형적 삭제 시 안전성 확보 |
주의할 점
다형적으로 사용할 클래스에 가상 소멸자가 없으면 파생 클래스 자원이 제대로 정리되지 않을 수 있습니다.