>

http://en.wikipedia.org/wiki/Diamond_problem

무엇을 의미하는지 알고 있지만이를 피하기 위해 어떤 조치를 취할 수 있습니까?

  • 답변 # 1

    실제적인 예 :

    class A {};
    class B : public A {};
    class C : public A {};
    class D : public B, public C {};
    
    

    클래스 D가 B와 C에서 상속받는 방법에 주목하십시오. 그러나 B와 C 모두 A에서 상속받습니다. 그러면 클래스 A의 사본 2 개가 vtable에 포함됩니다.

    이 문제를 해결하려면 가상 상속이 필요합니다. 사실상 상속되어야하는 클래스 A입니다. 따라서 문제가 해결됩니다.

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

  • 답변 # 2

    가상 상속. 그것이 바로 거기에 있습니다.

  • 답변 # 3

    여러 인터페이스의 상속 만 사용하려고합니다. 클래스의 다중 상속은 때때로 매력적이지만, 정기적으로 의존하면 혼란스럽고 고통 스러울 수 있습니다.

  • 답변 # 4

    상속은 강력하고 강력한 무기입니다. 정말로 필요할 때만 사용하십시오. 과거에, 다이아몬드 상속은 사용자가 "직원"이지만 "위젯 청취자"라고 말하면서도 분류에 대해 멀리 가고 있다는 신호였습니다.

    이 경우 여러 상속 문제가 발생하기 쉽습니다.

    컴포지션과 포인터를 소유자에게 돌려서 해결했습니다 :

    이전 :

    class Employee : public WidgetListener, public LectureAttendee
    {
    public:
         Employee(int x, int y)
             WidgetListener(x), LectureAttendee(y)
         {}
    };
    
    

    이후 :

    class Employee
    {
    public:
         Employee(int x, int y)
             : listener(this, x), attendee(this, y)
         {}
         WidgetListener listener;
         LectureAttendee attendee;
    };
    
    

    예, 액세스 권한은 다르지만 코드를 복제하지 않고 이러한 접근 방식으로 벗어날 수 있다면 성능이 떨어지기 때문에 더 좋습니다. (대안이 없을 때 전력을 절약 할 수 있습니다.)

  • 답변 # 5

    class A {}; 
    class B : public A {}; 
    class C : public A {}; 
    class D : public B, public C {};
    
    

    이 클래스 A의 속성은 클래스 D에서 두 번 반복되어 더 많은 메모리를 사용합니다. 따라서 메모리를 절약하기 위해 Vtable에 저장된 클래스 A의 상속 된 모든 속성에 대한 가상 속성을 만듭니다.

관련 자료

  • 이전 javascript - Chrome에서 키보드 이벤트 발생
  • 다음 javascript - 플래시를 사용하지 않고 선택한 텍스트를 클립 보드에 복사 - 크로스 브라우저 여야합니다