반응형
다중 상속(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를 가상 상속으로 바꿔주면 한곳에서 상속만 보장 되므로 해결
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 입출력(iostream), std::cin, std::cout (0) | 2019.05.14 |
---|---|
C++ 예외처리(Exception), noexcept, try, catch, throw (0) | 2019.05.14 |
C++ 다운캐스팅(Down Casting), static_cast, dynamic_cast (0) | 2019.05.12 |
C++ RTTI(Run Time Type Information), typeid, type_info (0) | 2019.05.12 |
C++ 가상 함수 테이블 (0) | 2019.05.12 |