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의 멤버 함수가 오버라이드 되어 호출되기 원하는지?

 

 

 

 

출처

https://modoocode.com/211

 

씹어먹는 C++ - <6 - 3. 가상함수와 상속에 관련한 잡다한 내용들>

모두의 코드 씹어먹는 C++ - <6 - 3. 가상함수와 상속에 관련한 잡다한 내용들> 작성일 : 2014-04-13 이 글은 49944 번 읽혔습니다. 에 대해서 배웁니다. 안녕하세요 여러분. 지난 강좌에서는 놀라움의 연

modoocode.com