티스토리 뷰

LANGUAGE/C++

[C++] MULTIPLE INHERITANCE - 다중 상속

진심스테이크 2018. 3. 13. 09:42

 

동적 바인딩

- 부모의 포인터로 자식을 접근하는 방식

- is ~a 관계일때만 사용 가능 //has ~a로 상속받으면 오류

- 동적 바인딩과 정적 바인딩의 방식은 다르지만, 결과는 같아야 한다

정적 바인딩 : 내꺼를 가지고 접근

 

단일 상속을 원칙으로 하되, 필요에 의해 다중 상속을 한다

 

#다중 상속 할때, 상속 방식을 꼭! 명시해야함 - private으로 자동으로 상속됨

 

다중 상속의 복잡성

만나는 구조로 상속을 받으면 같은게 2개를 상속 받아 쓰므로 터짐!

-> 해결 : 가상상속

 

 

 

 

 

 

 

              다중 상속                                   가상 상속

D가 어떤 부모 클래스 (B, C)를 사용할지에 따라 A를 사용하는 클래스가 지정되어 사용된다

 

다중 상속 주의점

1. 상속 방식을 명확하게 기재

2. 모호성 조심 -> 발생할 수 밖에 없는 상황이라면 가상 상속을 사용

3. 가상 상속을 했고, 외부에서 부모의 값을 넘길 때, 콜론 초기화 방법을 메모리에 맞게 해야 한다

 

#include "stdafx.h"
#include <iostream>
using namespace std;

class A {
    int a;
public :
    A(){} //기본생성자
    A(int a) { this->a = a; }
    void dispA() {
        cout << a << endl;
    }
};

class B : virtual public A{
    int b;
public :
    B() {}
    B(int a, int b) : A(a) { this->b = b; }
    void dispB() {
        cout << b << endl;
    }
};

class C : virtual public A{
    int c;
public : 
    C() {}
    C(int a, int c) : A(a) { this->c = c; }
    void dispC() {
        cout << c << endl;
    }
};

class D : public B, public C{
    int d;
public :
    D() {}
    D(int a, int b, int c, int d) : A(a), B(a, b), C(a, c) { this->d = d; }
    void dispD() {
        cout << d << endl;
    }
};

void main() {
    D dd(1,2,3,4);
    dd.dispD();
    dd.dispC();
    dd.dispB();
    dd.dispA(); //오류뜨지만, virtual을 상속함으로써 정상 작동
}

 

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

[C++] DYNAMIC BINDING - 동적 바인딩  (0) 2018.03.13
[C++] ABSTRACT CLASS - 추상 클래스  (0) 2018.03.13
[C++] 급여관리 프로그램  (0) 2018.03.12
[C++] CLASS RELATIONSHIP - 클래스 관계  (0) 2018.03.08
[C++] CONST  (0) 2018.03.08
댓글