반응형

다중 상속(Multiple Inheritance)

  • C++언어에서 2개 이상의 기반 클래스로 부터 상속 받을 수 있음
  • 다른 객체지향 언어에서는 허용되지 않는 경우가 많음
  • 기반 클래스의 멤버 이름이 동일한 경우 주의
#include <iostream>

struct A
{
    int a;
};
struct B
{
    int a;
};
struct C : public A, public B // 다중 상속
{
    int c;
};

int main()
{
    C c;
    // c.a = 10; 2개의 기반클래스에서 같은 멤버 이름을 사용하고 있으므로 ambiguous error
    c.A::a = 10; // 상속 받은 A 클래스의 a 멤버에 대입
    c.B::a = 20; // 상속 받은 B 클래스의 a 멤버에 대입
}

가상 상속(Virtual Inheritance)

  • 다이아몬드 처럼 다중 상속 기반 클래스가 같은 기반클래스를 상속 받아서 구현된 경우 동일 멤버를 이중 속상 받지 않도록 가상 상속을 사용해야 함

다이아몬드 상속

#include <iostream>

struct X
{
    int x;
};
struct A : public X // X의 멤버 x를 상속
{
    int a;
};
struct B : public X // X의 멤버 x를 상속
{
    int b;
};
struct C : public A, public B // 다중 상속
{
    int c;
};

int main()
{
    C c;
    c.x = 10; // 에러 X의 멤버인 x를 A, B 클래스가 상속받은 상태로 접근이 모호
}
#include <iostream>

struct X
{
    int x;
};
struct A : virtual public X // 가상 상속
{
    int a;
};
struct B : virtual public X // 가상 상속
{
    int b;
};
struct C : public A, public B // 다중 상속
{
    int c;
};

int main()
{
    C c;
    c.x = 10; // A, B를 가상 상속으로 바꿔주면 한곳에서 상속만 보장 되므로 해결
}
반응형

+ Recent posts