<소스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() 함수를 실행함
