728x90
[Do it C++ 완전정복_ 243~250p]
다형성 (Polymorphism)
상속받은 클래스들이 부모와 다른 다양한 특성을 가지는 것을 말한다.
- 같은 이름의 함수를 여러 클래스에서 다르게 구현할 수 있다. (오버라이딩)
- 부모 클래스의 포인터나 참조로 자식 객체를 제어할 수 있다.
- 실행 시점(런타임)에 실제 객체의 타입에 따라 호출되는 함수가 결정된다.
→ 주로 상속과 가상함수(virtual function) 를 통해 구현된다.
다형성 구현 예시
같은 'sound()' 함수 호출이지만, 실제 객체 타입에 따라 다르게 동작한다.
class Animal {
public:
virtual void sound() { cout << "동물의 소리" << endl; }
};
class Dog : public Animal {
public:
void sound() override { cout << "멍멍!" << endl; }
};
class Cat : public Animal {
public:
void sound() override { cout << "야옹!" << endl; }
};
int main() {
Animal* a1 = new Dog();
Animal* a2 = new Cat();
a1->sound(); // 멍멍!
a2->sound(); // 야옹!
}
다형성 구현
(1) 팩토리 클래스를 통한 객체 생성 분리
다형성을 활용하면 객체를 직접 new로 만들지 않고, 팩토리 클래스가 대신 생성해서 반환하도록 설계할 수 있다.
새로운 클래스가 추가되어도 기존 코드 수정 없이 확장 가능하다.
// 팩토리 클래스 추가
class AnimalFactory {
public:
static Animal* createAnimal(string type) {
if (type == "dog") return new Dog();
if (type == "cat") return new Cat();
return nullptr;
}
};
int main() {
Animal* animal = AnimalFactory::createAnimal("dog");
animal->sound(); // 멍멍!
delete animal;
}
(2) 함수 재정의 (오버라이딩_overriding)
부모 클래스의 함수를 자식 클래스에서 다시 정의하여 사용하는 것을 말한다.
가상함수를 사용하지 않으면 정적 바인딩이 되어 포인터 형식에 따라 호출이 결정된다.
class Parent {
public:
void show() { cout << "부모 클래스 함수" << endl; }
};
class Child : public Parent {
public:
void show() { cout << "자식 클래스 함수" << endl; } // 재정의
};
주의: 여기서 자식 클래스를 부모 클래스의 레퍼런스로 접근하면 부모 클래스에 정의된 함수가 호출된다.
(3) 가상함수(Virtual Function) 와 오버라이딩
함수가 virtual로 선언되어있지 않을 경우, 컴파일러는 정의 타입 클래스(부모 클래스)의 함수를 호출한다.
부모 클래스의 함수를 가상함수(virtual) 로 선언하면, 자식 클래스에서 이를 재정의했을 때 런타임에 실제 객체의 함수가 호출된다.
class Parent {
public:
virtual void show() { cout << "부모 클래스" << endl; }
};
class Child : public Parent {
public:
void show() override { cout << "자식 클래스" << endl; }
};
int main() {
Parent* p = new Child();
p->show(); // "자식 클래스" (가상함수 덕분에 런타임 결정)
}
'C++ > C++ 문법' 카테고리의 다른 글
| C++ 멤버 함수와 this 포인터 (0) | 2025.10.14 |
|---|---|
| C++ 생성자와 복사생성자, 소멸자 (0) | 2025.10.14 |
| C++ 바인딩 (Binding) (0) | 2025.10.14 |
| C++ 상속성 개념 및 다중 상속 (0) | 2025.10.14 |
| C++ 추상화,캡슐화 개념 및 접근 지정자 (0) | 2025.10.14 |