다중 상속

2020. 6. 12. 20:13프로그래밍/C++

다중 상속 시 생성자 호출 순서

 

파생 클래스에서 등장한 부모 클래스 순서대로 생성자 호출

초기화 리스트의 순서는 상관 없음

 

// Student(), Faculty() 순으로 호출

class TA : public Student, public Faculty

{

};

 


Java에서처럼 super()를 쓸 수 없는 이유 (부모 클래스의 생성자 호출)

다중 상속이 가능하기 때문

여러 클래스로부터 동시에 상속을 받을 수 있기 때문에 한 클래스만(super()) 부를 수 없음

 

 


다이아몬드 문제

 

class Animal

{

public:

    virtual Walk();
};

 

class Tiger : public Animal

{

public:

    virtual Walk();

};

 

class Lion : public Animal

{

public:

    virtual Walk();

};

 

class Liger : public Tiger, public Lion

{

    // ...

};

 

1. 어떤 함수가 호출될지 모호할 때는 우리가 직접 부모 클래스를 특정해줘야 함

myLiger->Walk();            // ??

myLiger->Tiger::Walk();   // OK

 

2. Liger 개체 만들면 Animal의 데이터가 두 번 생기는 문제점

가상 베이스 클래스 쓰면 됨

클래스 상속할 때 virtual 키워드 붙이면 다중 상속 받더라도 부모 클래스의 데이터가 하나만 있는 것을 보장

 

class Animal

{

public:

    virtual Walk();
};

 

class Tiger : virtual public Animal

{

public:

    virtual Walk();

};

 

class Lion : virtual public Animal

{

public:

    virtual Walk();

};

 

class Liger : public Tiger, public Lion

{

    // ...

};


다중 상속 최대한 쓰지 말자...

 

다중 상속 하려면 결국 헤더를 손봐야하는데

다중 상속 받겠다고 후임자가 나중에 virtual 붙이는 것도 웃기고

앞으로 태어날 혼종(?)을 위해 미리 virtual 붙이는 것도 웃기고

 

대신 인터페이스를 사용할 것

 

 

출처 : 포큐아카데미 C++ 언매니지드 프로그래밍