728x90
Multiple Inheritance;다중상속
하나의 파생 클래스가 여러 클래스를 동시에 상속 받는 경우를 말하며,
그 효용성에 비해 반대급부가 커서 사용하지 않는 편이며,
C#, Java에서는 지원하지 않음.
여러 클래스를 상속받아 재사용과 효율을 높일 수 있겠지만,
치명적인 문제를 가지고 있음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> using namespace std; class BaseIO { public: int mode; }; class In : public BaseIO { public: int readPos; }; class Out : public BaseIO { public: int writePos; }; class InOut : public In, public Out { public: bool safe; }; int main() { InOut ioObj; ioObj.readPos = 10; ioObj.writePos = 20; ioObj.safe = true; ioObj.mode = 5; } | cs |
1. InOut의 safe 변수 배정
2. In의 readPos 변수 배정
3. In클래스 상속으로 BaseIO의 mode 배정
4. Out의 writePos 변수 배정
5. Out클래스 상속으로 BaseIO의 mode 배정
위 코드에서 BaseIO 클래스를 In, Out 클래스가 상속받으면서,
2개의 mode 변수가 배정된다.
InOut 클래스에서 In, Out을 다중상속 받으면
따라서 mode 변수가 정확히 어떤 것을 지칭하는지 확인하지 못해 접근할 수 없어,
컴파일러에서 오류를 발생시킴
이러한 컴파일 오류는
virtual 키워드를 이용한 가상상속 선언을 통해 해결 가능
virtual 키워드가 컴파일러에게 파생 클래스 객체 생성 시,
기본 클래스의 멤버 공간을 오직 한 번 할당하고
이미 할당된 경우 그것을 공유하게 하여, mode 변수 접근의 모호성을 해소할 수 있음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> using namespace std; class BaseIO { public: int mode; }; class In : virtual public BaseIO { public: int readPos; }; class Out : virtual public BaseIO { public: int writePos; }; class InOut : public In, public Out { public: bool safe; }; int main() { InOut ioObj; ioObj.readPos = 10; ioObj.writePos = 20; ioObj.safe = true; ioObj.mode = 5; } | cs |
이 경우, 상기에 명시된 1~4 과정은 동일한데,
5번의 경우 이미 3번 과정에서 생성된 mode를 공유하기 때문에 모호성이 해결된다.
728x90
'Programming Language > C,C++' 카테고리의 다른 글
C++] 참조에 의한 호출로 객체 전달 (0) | 2017.06.21 |
---|---|
C] memset, memcmp (0) | 2017.06.04 |
C++] RTTI(Run-Time Type Information) (0) | 2017.06.02 |
C,C++] 비트 연산 매크로 (0) | 2017.06.01 |
C,C++] cin/cout, scanf/printf (0) | 2017.05.30 |