C++에서 다단계 상속(Multi-level Inheritance)은 하나의 클래스가 다른 클래스를 상속하고, 그 파생 클래스가 다시 또 다른 클래스에 의해 상속되는 구조를 말합니다. 이번 글에서는 세 개의 클래스인 Vehicle, FourWheeler, Car를 활용해 다단계 상속의 동작 원리를 코드와 함께 자세히 살펴보겠습니다.
다단계 상속 구조 이해하기
여기서 Vehicle 클래스는 최상위 기반(Base) 클래스이고, FourWheeler 클래스는 Vehicle을 상속받은 1차 파생 클래스입니다. 그리고 Car 클래스는 FourWheeler를 다시 상속받아 최종적으로 모든 기능을 물려받게 됩니다.
- Vehicle 클래스: 'I am a vehicle'을 출력하는 vehicle() 메서드 보유
- FourWheeler 클래스: 'I have four wheels'를 출력하는 fourWheeler() 메서드 보유
- Car 클래스: 'I am a car'를 출력하는 car() 메서드 보유
다단계 상속 구조에서 Car 객체는 조상 클래스들의 모든 public 멤버 함수에 접근할 수 있습니다. 따라서 Car 객체로부터 car(), fourWheeler(), vehicle() 메서드를 순서대로 호출하면 다음과 같은 결과가 출력됩니다.
I am a car
I have four wheels
I am a vehicle
구현 단계
문제를 해결하기 위해 다음 순서대로 진행합니다.
- Vehicle 클래스 정의: vehicle() 함수 안에서 "I am a vehicle"을 출력합니다.
- FourWheeler 클래스 정의: Vehicle 클래스를 public으로 상속받고, fourWheeler() 함수 안에서 "I have four wheels"를 출력합니다.
- Car 클래스 정의: FourWheeler 클래스를 public으로 상속받고, car() 함수 안에서 "I am a car"를 출력합니다.
예제 코드
다음은 전체 동작 과정을 보여주는 C++ 구현 예제입니다.
#include <iostream>
using namespace std;
class Vehicle{
public:
void vehicle(){
cout<<"I am a vehicle\n";
}
};
class FourWheeler : public Vehicle{
public:
void fourWheeler(){
cout<<"I have four wheels\n";
}
};
class Car : public FourWheeler{
public:
void car(){
cout<<"I am a car\n";
}
};
int main(){
Car obj;
obj.car();
obj.fourWheeler();
obj.vehicle();
return 0;
}
입력
Car obj;
obj.car();
obj.fourWheeler();
obj.vehicle();
출력 결과
I am a car
I have four wheels
I am a vehicle
핵심 포인트 정리
이 예제에서 가장 중요한 점은 Car 객체 하나만으로도 상속 계층 전체의 메서드를 호출할 수 있다는 것입니다. 즉, obj.car(), obj.fourWheeler(), obj.vehicle() 호출이 모두 정상적으로 동작하며, 각 클래스가 자신의 고유 기능을 유지하면서 하위 클래스로 기능이 전달됩니다.
또한 상속 시 public 상속(public inheritance)을 사용했기 때문에 기반 클래스의 public 멤버들이 파생 클래스에서 그대로 public으로 유지됩니다. 만약 protected나 private 상속을 사용한다면 접근 권한이 달라지므로, 상속 방식에 따른 접근 제어 차이도 함께 이해해 두면 좋습니다.