도슐랭스타

C++ - 다중상속의 문제점(다이아몬드 문제) 본문

C++

C++ - 다중상속의 문제점(다이아몬드 문제)

도도.__. 2023. 12. 1. 14:30

다중상속

  • 하나의 클래스가 여러 개의 부모 클래스로부터 상속을 받는 것이다.

다중 상속을 지원하지 않는 프로그래밍 언어가 많다.(ex.Java, C#, Ruby, Swift)
-> 다중 상속을 사용할 경우 '다이아몬드 문제(Diamond Problem)'라고 불리는 상황이 발생할 수 있기 때문에 사용 시 주의가 필요하다.

다이아몬드 문제( Diamond Problem )

       A
      / \
     B   C
      \ /
       D
  • 이름 충돌
    • 클래스 D가 클래스 B와 클래스 C로부터 상속 받은 멤버 중 동일한 이름을 가진 멤버가 있는 경우, 해당 멤버에 접근할 때 모호성이 발생한다. 컴파일러는 어떤 멤버에 접근해야 하는지 판단하기 어려워 에러가 발생한다.
  • 중복된 데이터
    • 클래스 D가 클래스 B와 클래스 C로부터 각각 상속 받은 클래스 A의 멤버를 두 번 가지고 있을 수 있다. 이 경우, 메모리 공간에 중복된 데이터가 저장되어 메모리 낭비가 발생한다.

다이아몬드 문제가 발생하는 다중 상속 코드 - 이름 충돌

#include <iostream>
using namespace std;

class A {
public:
    void method() {
        cout << "클래스 A" << endl;
    }
};

class B : public A {
public:
    void method() {
        cout << "클래스 B" << endl;
    }
};

class C : public A {
public:
    void method() {
        cout << "클래스 C" << endl;
    }
};

// B와 C를 다중 상속받음
class D : public B, public C {
};

int main() {
    D child;
    child.method(); // ???어떤 클래스의 method()를 호출???

    return 0;
}

다이아몬드 문제가 발생하는 다중 상속 코드 - 중복된 데이터

#include <iostream>
using namespace std;

class A {
protected:
    int data;
public:
    A(int value) : data(value) {}
};

class B : public A {
public:
    B(int value) : A(value) {}
};

class C : public A {
public:
    C(int value) : A(value) {}
};

// B와 C를 다중 상속받음
class D : public B, public C {
public:
    D(int value) : B(value), C(value) {}
};

int main() {
    D child(10);
    cout << child.B::data << endl; // B 클래스의 data 출력
    cout << child.C::data << endl; // C 클래스의 data 출력
    cout << child.data << endl; // ???어떤 클래스의 data를 출력하지???

    return 0;
}

컴파일 오류가 발생하지는 않지만 실제로는 모호성 때문에 예기치 않은 결과가 출력되거나 메모리 공간에 중복된 데이터가 저장되어 메모리 낭비가 발생할 수 있다.

다이아몬드 문제를 해결하기 위해 C++에서는 '가상 상속(virtual inheritance)'을 지원한다!

반응형

'C++' 카테고리의 다른 글

C++ - 템플릿(Template)  (1) 2023.12.06
C++ - 바인딩(binding)  (1) 2023.12.06
C++ - overriding, 가상함수(virtual function)  (0) 2023.11.29
C++ - 다중 상속  (0) 2023.11.29
C++ - 상속성  (3) 2023.11.22
Comments