728x90
[Do it C++ 완전정복_ 301~310p]
다중 상속의 단점
다중 상속
- 하나의 클래스가 두 개 이상의 부모 클래스로부터 상속받는 것
class A { };
class B { };
class C : public A, public B { }; // 다중 상속
다중 상속의 단점
- 모호성: 여러 부모 클래스에 동일한 이름의 멤버가 존재할 경우, 어떤 부모의 멤버를 사용해야 하는지 모호함
- 다이아몬드 상속 : 공통 부모를 중복 상속할 때, 상위 클래스의 멤버가 중복 복사되어 두 번 존재하는 문제 발생
→ 대안으로 컴포지션과 어그리게이션을 사용한다.
다중 상속 단점 보완
컴포지션 (Composition)
클래스가 다른 클래스를 멤버 변수로 포함(Has-A 관계) 하여 기능을 확장하거나 재사용하는 방식
- 클래스 안에 다른 객체를 멤버로 ‘포함’하는 방식으로 재사용을 구현
- 생명주기 공유 → Car가 사라지면 Engine도 함께 소멸됨 (강한 결합 관계)
class Engine {
public:
void start() { cout << "엔진 가동\n"; }
};
class Car {
private:
Engine engine; // 포함 관계 (Composition)
public:
void run() {
engine.start(); // Engine 기능 사용
cout << "자동차 주행\n";
}
};
어그리게이션 (Aggregation)
컴포지션과 유사하지만, 포함된 객체가 독립적인 생명주기를 가진다는 점이 다르다.
- Car는 Engine을 가지고 있지만 Engine은 Car와 별도로 존재 가능
- 객체 간 연결 관계에 가깝다. (약한 결합 관계)
class Engine {
public:
void start() { cout << "엔진 시동\n"; }
};
class Car {
private:
Engine* engine; // 포인터 사용 (외부에서 주입)
public:
Car(Engine* e) : engine(e) {}
void run() { engine->start(); cout << "차량 주행\n"; }
};
int main() {
Engine e;
Car c(&e); // 외부에서 전달받음
c.run();
}
'C++ > C++ 문법' 카테고리의 다른 글
| C++ 정적(static) 멤버 변수와 함수 (0) | 2025.10.14 |
|---|---|
| C++ 가상 함수와 추상 클래스, 인터페이스 (0) | 2025.10.14 |
| C++ 부모 클래스 접근 지정자, 프랜드(friend) (0) | 2025.10.14 |
| C++ 오버로딩 (Overloading) (0) | 2025.10.14 |
| C++ 멤버 함수와 this 포인터 (0) | 2025.10.14 |