C++
[C++] 가상 상속
hanseongbugi
2024. 12. 17. 11:19
다중 상속 (Multiple inheritance)
- C++은 다중 상속을 지원한다.
- 하나의 클래스가 다른 여러 개의 클래스들을 상속 받는 것을 허용
class A {
public:
int a;
};
class B {
public:
int b;
};
class C : public A, public B {
public:
int c;
};
- 위 경우, 클래스 C가 A와 B로 부터 동시에 같이 상속 받고 있음
- A와 B의 내용이 모두 C에 들어가 있다.
C c;
c.a = 3;
c.b = 2;
c.c = 4;
- 와 같은 것이 가능하게 된다.
- 다중 상속에서 생성자의 호출 순서는 상속 받은 순서에 의해 결정된다.
- 위 코드의 경우 A가 가장 먼저 상속받았으므로 A -> B -> C 순서로 호출된다.
- 만약 상속 순서가 B가 먼저로 바뀌면 B -> A -> C가 될 것
다중 상속 시 주의할 점
- 다중 상속은 C++에서 많이 사용되는 기법이지만 주의해야할 점이 있다.
class A {
public:
int a;
};
class B {
public:
int a;
};
class C : public A, public B {
public:
int c;
};
- 만약, 두 개의 클래스에서 이름이 같은 멤버가 존재
- 만일 C객체를 생성하여 종복되는 멤버에 접근하면 에러 발생
- 다중 상속 사용 시 다이아몬드 상속(Diamond inheritance)을 주의해야함
class Human {
// ...
};
class HandsomeHuman : public Human {
// ...
};
class SmartHuman : public Human {
// ...
};
class Me : public HandsomeHuman, public SmartHuman {
// ...
};
- HansomeHuman과 SmartHuman은 Human클래스를 상속 받음
- Me클래스는 HansomeHuman과 SmartHuman클래스를 상속받음
- 즉, Me클래스는 Human클래스를 2번 상속받게 된다.
- 같은 클래스를 두 번 상속받게 된다면, 같은 멤버가 2개 존재하게 된다.
- 따라서 겹쳐서 상속받을 수 있는 클래스는 virtual을 사용해서 상속 받는다.
class Human {
public:
// ...
};
class HandsomeHuman : public virtual Human {
// ...
};
class SmartHuman : public virtual Human {
// ...
};
class Me : public HandsomeHuman, public SmartHuman {
// ...
};
- 위와 같이 상속받게 된다면, Me에서 다중 상속 시에도 컴파일러는 언제나 Human을 한 번만 포함
다중 상속은 언제 사용할까?
- 차량(Vehicle) 클래스
- 차량의 종류로는 땅에서 다니는 차, 물에서 다니는 차, 하늘에서 다니는 차 등이 있을 수 있다.
- 또한, 이 차량들은 각기 다른 동력원을 사용할 것이다.
- 이러한 차량 클래스들은 아래 질문에 만족한다면, 다중 상속을 사용할 수 있다.
- `Vehicle 레퍼런스가 LandVehicle을 참조하고 있다면 Vehicle의 멤버 함수를 호출하였을 때, LandVehicle의 멤버 함수가 오버라이드 되어 호출되기를 바라는지?
- Vehicle 레퍼런스가 실제 GasPowerVehicle을 참조할 때 Vehicle 레퍼런스의 멤버함수를 호출한다면, GasPowerVehicle의 멤버 함수가 오버라이드 되어 호출되기 원하는지?
출처