본문 바로가기

Programming/C++ 3

[C++] 09-02. 다중상속

반응형

다중상속

둘 이상의 클래스를 상속하는 형태로, 득보다 실이 많아 문제가 많으므로 자주 사용하지 않는 문법이다

 

다중상속을 하더라도 하나의 특성을 강하게 띄므로

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;
}

 

 

반응형