이 튜토리얼에서는 실전 코드 예제와 함께 C++ 상속 패턴인 다중 상속, 다단계 상속, 계층형 상속을 탐구합니다.
상속은 객체 지향 프로그래밍의 기초 기능입니다. 기존 클래스로부터 속성과 동작을 상속받아 새로운 클래스를 만들 수 있게 해줍니다.
아래에서 C++에서 사용 가능한 세 가지 핵심 상속 모델을 살펴봅니다.
C++ 다단계 상속
다단계 계층에서 클래스는 다른 파생 클래스로부터 파생됩니다. 기반 클래스에 도달할 때까지 체인이 계속됩니다.
class A {
// 기반 클래스 구현
};
class B : public A {
// B가 A로부터 상속
};
class C : public B {
// C가 B로부터 상속
};
여기서 B는 A로부터 상속받고, C는 B로부터 상속받아 수직적인 상속 체인을 형성합니다.
예제 1: C++ 다단계 상속
#include <iostream>
using namespace std;
class A {
public:
void display() {
cout << "Base class content." << endl;
}
};
class B : public A {};
class C : public B {};
int main() {
C obj;
obj.display();
return 0;
}
출력
Base class content.
이 프로그램은 C 객체가 궁극적인 기반 클래스 A에 정의된 display()를 호출할 수 있음을 보여줍니다. B나 C에 오버라이딩 구현이 없기 때문입니다. 컴파일러는 가장 파생된 클래스부터 상속 체인을 거슬러 올라가며 호출을 해결합니다.
C++ 다중 상속
C++에서는 클래스가 둘 이상의 기반 클래스로부터 상속받을 수 있습니다. 예를 들어 Bat(박쥐)는 Mammal(포유류)과 WingedAnimal(날개 달린 동물) 양쪽에서 파생될 수 있습니다. 박쥐는 동시에 포유류이자 날개 달린 동물이기 때문입니다.
예제 2: C++ 다중 상속
#include <iostream>
using namespace std;
class Mammal {
public:
Mammal() {
cout << "Mammals can give direct birth." << endl;
}
};
class WingedAnimal {
public:
WingedAnimal() {
cout << "Winged animals can flap." << endl;
}
};
class Bat : public Mammal, public WingedAnimal {};
int main() {
Bat b1;
return 0;
}
출력
Mammals can give direct birth.
Winged animals can flap.
다중 상속에서 모호성 해결
두 기반 클래스가 같은 이름의 함수를 제공하면 컴파일러가 어느 것을 호출할지 결정할 수 없어 모호성 오류가 발생합니다.
class Base1 {
public:
void someFunction() { /* ... */ }
};
class Base2 {
public:
void someFunction() { /* ... */ }
};
class Derived : public Base1, public Base2 {};
int main() {
Derived obj;
// obj.someFunction(); // 오류: 모호함
}
계층형 상속에서는 여러 파생 클래스가 단일 기반 클래스로부터 상속받습니다. 모든 공통 속성과 동작은 기반 클래스에 캡슐화되고, 각 파생 클래스는 자신만의 특수화를 추가할 수 있습니다.
예시로는 Physics, Chemistry, Biology가 Science로부터 파생되는 경우와 Dog, Cat, Horse가 Animal로부터 파생되는 경우가 있습니다.
계층형 상속 문법
class BaseClass {
// 기반 클래스 내용
};
class DerivedOne : public BaseClass {
// 추가 멤버
};
class DerivedTwo : public BaseClass {
// 추가 멤버
};
class DerivedThree : public BaseClass {
// 추가 멤버
};
예제 3: C++ 계층형 상속
// C++ 계층형 상속을 보여주는 프로그램
#include <iostream>
using namespace std;
// 기반 클래스
class Animal {
public:
void info() {
cout << "I am an animal." << endl;
}
};
// 파생 클래스 1
class Dog : public Animal {
public:
void bark() {
cout << "I am a Dog. Woof woof." << endl;
}
};
// 파생 클래스 2
class Cat : public Animal {
public:
void meow() {
cout << "I am a Cat. Meow." << endl;
}
};
int main() {
// Dog 인스턴스
Dog dog1;
cout << "Dog Class:" << endl;
dog1.info();
dog1.bark();
// Cat 인스턴스
Cat cat1;
cout << "\nCat Class:" << endl;
cat1.info();
cat1.meow();
return 0;
}
출력
Dog Class:
I am an animal.
I am a Dog. Woof woof.
Cat Class:
I am an animal.
I am a Cat. Meow.
Dog와 Cat 모두 Animal로부터 info() 메서드를 상속받으며, 각 클래스는 자신만의 특수 동작을 추가합니다.