Programming Language/C,C++

C++] 다중상속(Multiple Inheritance)

TwinParadox 2017. 6. 3. 00:00
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