본문 바로가기

C++ 기초 1

[C++] 4-5 가상 기본 클래스 (Virtual base class)

가상 기본 클래스

   Child 클래스가 여러 개의 Parent 클래스를 직접 상속받는 경우 모호한 문제가 발생할 수 있다. 예를 들어 클래스 C1과 C2가 P1에게 직접 상속을 받고, 클래스 C3가 C1과 C2를 직접 상속받는 경우가 그러하다. 그러면 C3가 P1을 두 번 상속받게 된다. 한 번은 C2을 통해서 상속되고, 또 한 번은 클래스 C2를 통해서 상속된다. 이것은 클래스 C3 객체가 생성될 때 클래스 P1의 복사본이 두 개 존재하게 되는 것을 의미한다.  C++에서는 어떤 Child 클래스가 동일한 Parent 클래스를 간접적으로 두 번 이상 상속받을 때 오직 한 번만 상속받도록 가상 기본 클래스 (virtual base class) 기능을 제공한다. 가상 클래스 기능을 사용하려면 parent 클래스를 직접 상속받는 모든 파생 클래스를 접근 지정자 앞에 예약어 virtual을 붙여 정의해 주어야 한다. 아래 예제에서 자세한 내용을 확인할 수 있다. 

 

 
예제
#include <iostream>
using namespace std;
class P1 {	//P1을 가상 기본 클래스로 상속
public:
	int a;
};

class C1 : virtual public P1 {	//P1을 가상 기본 클래스로 상속
public:
	int b;
};

class C2 : virtual public P1 {
public:
	int c;
};

class C3 : public C1, public C2 {
public: int sum, mul;
};

int main()
{
	C3 ob;	//객체 생성
	ob.a = 10;
	ob.b = 20;
	ob.c = 30;
	ob.sum = (ob.a + ob.b + ob.c);
	ob.mul = (ob.a * ob.b * ob.c);
	cout << "sum=" << ob.sum << endl;
	cout << "mul=" << ob.mul << endl;
	return 0;
}
실행 결과
sum=60
mul=6000
  • Child 클래스 C1과 C2는 Parent 클래스 P1을 가상 기본 클래스로 상속받았으므로 C1과 C2를 직접 상속받는 클래스 C3에는 P1의 멤버 a의 복사본이 하나만 존재한다.
  • 따라서 main()함수에서 ob.a를 참조하는 경우 모호한 문제가 발생하지 않는다. 하지만 C1과 C2를 정의할 때 예약어 virtual을 생략하면 ob.a는 C1과 C2 중의 어느 것을 통해서 참조해야 할지 모호하므로 오류가 발생한다. 
 

 

참고

1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13