반응형
다중상속
둘 이상의 클래스를 상속하는 형태로, 득보다 실이 많아 문제가 많으므로 자주 사용하지 않는 문법이다
다중상속을 하더라도 하나의 특성을 강하게 띄므로
IS-A 관계표현이 힘들어 부모의 특성을 단순히 재활용하는 경우에만 사용한다.
//다중 상속
#include <iostream>
using namespace std;
class BaseOne
{
public:
void SimpleFuncOne() { cout << "BaseOne" << endl; }
};
class BaseTwo
{
public:
void SimpleFuncTwo() { cout << "BaseTwo" << endl; }
};
class MultiDerived :public BaseOne, protected BaseTwo
{
public:
void ComplexFunc()
{
SimpleFuncOne();
SimpleFuncTwo();
}
};
int main(void)
{
MultiDerived mdr;
mdr.ComplexFunc();
return 0;
}
다중상속의 모호성
함수의 이름이 같으면 호출의 대상을 구분해서 명시해야한다.
//다중 상속
#include <iostream>
using namespace std;
class BaseOne
{
public:
void SimpleFunc() { cout << "BaseOne" << endl; }
};
class BaseTwo
{
public:
void SimpleFunc() { cout << "BaseTwo" << endl; }
};
class MultiDerived :public BaseOne, protected BaseTwo
{
public:
void ComplexFunc()
{
BaseOne::SimpleFunc();
BaseTwo::SimpleFunc();
}
};
int main(void)
{
MultiDerived mdr;
mdr.ComplexFunc();
return 0;
}
더 모호한 상황
호출의 대상 파악이 불가능하다 : Base의 멤버가 두개나 가지고 있기 때문에
다이아몬드 상속에서의 문법적 정의 : 가상상속을 통해서 공통의 기초클래스의 멤버를 하나만 포함시킨다.
#include <iostream>
using namespace std;
class Base
{
public:
Base() { cout << "Base Constructor" << endl; }
void SimpleFunc() { cout << "BaseOne" << endl; }
};
class MiddleDerivedOne : virtual public Base
{
public:
MiddleDerivedOne() :Base()
{
cout << "MiddleDerivedOne Constructor" << endl;
}
void MiddleFuncOne()
{
SimpleFunc();
cout << "MiddleDerivedOne" << endl;
}
};
class MiddleDerivedTwo :virtual public Base
{
public:
MiddleDerivedTwo() : Base()
{
cout << "MiddleDerivedTwo Constructor" << endl;
}
void MiddleFuncTwo()
{
SimpleFunc();
cout << "MiddleDerivedTwo" << endl;
}
};
class LastDerived :public MiddleDerivedOne, public MiddleDerivedTwo
{
public:
LastDerived() :MiddleDerivedOne(), MiddleDerivedTwo()
{
cout << "LastDerived Constructor" << endl;
}
void ComplexFunc()
{
MiddleFuncOne();
MiddleDerivedTwo();
SimpleFunc();
}
};
int main(void)
{
cout << "객체생성 전....." << endl;
LastDerived ldr;
cout << "객체생성 후....." << endl;
ldr.ComplexFunc();
return 0;
}
반응형
'Programming > C++ 3' 카테고리의 다른 글
[C++] 12-01. 대입연산자 오버로딩 (0) | 2021.05.30 |
---|---|
[C++] 10-01. 연산자 오버로딩의 이해와 유형 (0) | 2021.05.30 |
[C++] 09-01. 멤버함수와 가상함수의 동작 원리 (0) | 2021.05.30 |
[C++] 08-03. 가상 소멸자 (0) | 2021.05.30 |
[C++] 08-02. 가상함수 [급여관리 시스템 3단계] (0) | 2021.05.29 |