본문 바로가기

C++

[C++] 다중 상속(multiple inheritance)

이번 시간에는 다중 상속에 대해서 알아보겠습니다.

 

 

#include <iostream>

class A
{
public:
    int a;
    A() { std::cout << "A class 생성자 호출" << std::endl; }
};

class B
{
public:
    int b;
    B() { std::cout << "B class 생성자 호출" << std::endl; }
};

class C : public A, public B // *******************
{
public:
    int c;
    C() { std::cout << "C class 생성자 호출" << std::endl; }
};

int main()
{
    C c;
    c.a = 10;
    c.b = 20;
    c.c = 30;
}

 

 

상속 순서에 따라서 생성자의 호출 순서도 변경된다.

 

class C : public A, public B 순서로 상속하는 경우 
A class 생성자 호출
B class 생성자 호출
C class 생성자 호출

class C : public B, public A 순서로 상속하는 경우
B class 생성자 호출
A class 생성자 호출
C class 생성자 호출

 

 

다중 상속 주의할 점

1. 부모 클래스 간에 동일한 이름의 변수나 함수가 있다면 오류 발생한다.

2. 다이아몬드 상속이라 불리우는 부모 클래스들의 부모클래스가 같은 경우, virtual 키워드를 사용해서 상속을 해야 한다.

이러한 형태로 A를 virtual 로 상속 받는다면, D 에서 다중 상속 시에도, 컴파일러가 언제나 A 를 한 번만 포함하도록 지정할 수 있게 됩니다. 참고로, 가상 상속 시에, D 의 생성자에서 B 와 C 의 생성자뿐만 아니라, A 의 생성자도 호출해야한다.

 

class A {
 public:
  // ...
};
class B : public virtual A {
  // ...
};
class C : public virtual A {
  // ...
};
class D : public B, public C {
  // ...
};