'virtual'에 해당되는 글 1건

  1. 2007/01/30 virtual 함수의 상속 관련

<소스1>
#include <stdio.h>

class CBaseClass
{
public:
void A(void)
{
printf("CBaseClass A()\n");
};

virtual void B() = 0;

void D(void)
{
printf("CBaseClass D()\n");
}

void C(void)
{
printf("CBaseClass C()\n");
this->B();
this->D();
}
};

class CBaseDerived1 : public CBaseClass
{
public:
void A(void)
{
printf("CBaseDerived1 A()\n");
};

void B()
{
printf("CBaseDerived1 B()\n");
};

void D(void)
{
printf("CBaseDerived1 D()\n");
}
};

void main(void)
{
CBaseDerived1 *a1 = new CBaseDerived1;
a1->A();   // 상속된 CBaseDerived1.A() 를 실행
a1->C();  // CBaseClass의 C()를 수행하고,
              // C() 함수 내에서 virtual 함수를 상속한 CBaseDerived1.B()를 수행
              // C() 함수 내에서 CBaseClass의 D()를 수행

delete a1;
}

<결과1 - virtual 함수를 상속한 함수의 실행>
CBaseDerived1 A()
CBaseClass C()
CBaseDerived1 B()
CBaseClass D()

<소스2>
#include <stdio.h>

class CBaseClass
{
public:
void A(void)
{
printf("CBaseClass A()\n");
};

virtual void B(void) { printf("CBaseClass B() - virtual \n"); } ;

void D(void)
{
printf("CBaseClass D()\n");
}

void C(void)
{
printf("CBaseClass C()\n");
this->B();
this->D();
}
};

class CBaseDerived1 : public CBaseClass
{
public:
void A(void)
{
printf("CBaseDerived1 A()\n");
};

void B()
{
//printf("CBaseDerived1 B()\n");
CBaseClass::B();         // 원래 Class의 B() 함수를 수행하도록 함
};

void D(void)
{
printf("CBaseDerived1 D()\n");
}
};

void main(void)
{
CBaseDerived1 *a1 = new CBaseDerived1;
a1->A();
a1->C();

delete a1;
}

<결과 2 - virtual 함수에 정의되어 있는 코드 실행>
CBaseDerived1 A()
CBaseClass C()
CBaseClass B() - virtual    // CBaseDerived1.B() 함수를 실행하였으나, 그 함수가 CBaseClass::B();를 실행하도록 함
CBaseClass D()

<요약>
1. virtual 로 정의된 함수를 실행할 경우, 무조건 하위 class에 재정의 된 함수를 실행하게 됨
2. 하위 class에 재정의 된 함수에서, 상위 class의 virtual 함수를 실행할 수도 있음
3. 만약, CBaseDerived1.B() 함수를 주석처리하면, 어쩔 수 없이(?) virtual임에도 불구하고 CBassClass.B() 함수를 실행함