반응형
다중 상속 (Multiple Inheritance)
- 부모 클래스를 둘 이상 동시에 상속하는 것을 말한다.
- C++은 다중 상속을 지원하는 언어이다.
- 득보다 실이 많은 문법이라 알아만 두고 사용은 하지말것.
※ JAVA, C#에서만 보더라도 다중 상속을 지원하지 않는다.
다중 상속의 모호성
1. 다중 상속의 둘 이상의 부모 클래스의 동일한 이름의 멤버가 존재하는경우 문제가 발생한다.
#include <iostream>
using namespace std;
class Parent_1
{
public:
void Func()
{
cout << "Parent_1 func." << endl;
}
};
class Parent_2
{
public:
void Func()
{
cout << "Parent_2 func." << endl;
}
};
class Child : public Parent_1, public Parent_2
{
public:
void ChildFunc()
{
//에러
Func();
Func();
}
};
void main()
{
Child child;
child.ChildFunc();
}
- 코드를 실행하면 Func()함수의 모호성을 컴파일에러로 뱉는다.
- 위와 같은 모호성에는 다음과 같이 호출 함수 앞에 클래스를 명시해줘야한다.
void ChildFunc()
{
Parent_1::Func();
Parent_2::Func();
}
2. 다중상속의 대상이 되는 부모 클래스(B, C)가 같은 부모 클래스(A)를 상속을 한 클래스일 때, 자식 클래스의 객체 내에 두 개의 A 클래스 멤버가 존재하는 문제가 발생한다.
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "A Constructor" << endl;
}
void Func()
{
cout << "A func." << endl;
}
};
class B : public A
{
public:
B()
{
cout << "B Constructor" << endl;
}
};
class C : public A
{
public:
C()
{
cout << "C Constructor" << endl;
}
};
class D : public B, public C
{
public:
D()
{
cout << "D Constructor" << endl;
}
void ChildFunc()
{
B::Func();
C::Func();
}
};
void main()
{
D d;
d.ChildFunc();
//결과
//A Constructor
//B Constructor
//A Constructor
//C Constructor
//D Constructor
//A Func.
//A Func.
}
- ChildFunc() 함수를 보면 간접적으로 상속한 A 클래스의 Func()함수를 호출하기 위해 함수 앞에 A를 명시해 모호성을 제거해줬다.
- 결과를 확인해보면 D 클래스의 객체에서 A 클래스가 2개 존재하는것을 확인할 수 있다.
- 위와 같은 중복 상속을 해결하기 위한 문법이 '가상 상속'이다.
- 위 코드에서 A 클래스는 중복 상속될 필요가 없으므로 B, C 클래스에서 'virtual' 키워드로 가상 상속한다.
class B : virtual public A { . . };
class C : virtual public A { . . };
class D : public B, public c { . . };
//결과
//A Constructor
//B Constructor
//C Constructor
//D Constructor
반응형
'Stack > C++' 카테고리의 다른 글
C++ 연산자 오버로딩 (0) | 2021.12.05 |
---|---|
C++ friend (0) | 2021.12.05 |
C++ 멤버함수, 가상함수 동작원리 (0) | 2021.11.17 |
C++ 순수 가상함수, 추상 클래스 (0) | 2021.11.11 |
C++ 업캐스팅, 오버라이딩, 가상함수 (0) | 2021.11.08 |