다소 황당하기도 하고, 언젠가 책에서 본것같기도 한 내용입니다. 하지만 저는 당연이 되리라 생각했던지라... 왜 않되냐며 약간 열 받기도 하였습니다. 어떤 내용인냐면...
먼저 Base라는 클래스가 있고, 이 클래스는 A라는 순수 가상 함수가 있습니다.
class Base {
public:
Base() { };
void TTT() {
A();
}
public:
virtual void A() = 0;
}; 보시면 TTT라는 함수에서 A 함수를 호출하고 있구요. 이제 Base를 상속받는 Derv라는 함수를 정의해 봅니다.
class Derv : public Base {
public:
virtual void A() {
printf("impl");
}
}; 상속받는 클래스는 기본 클래스의 순수 가상 함수를 구현해야할 책임이 있으므로 A 함수를 구현합니다. 이제 Base 함수를 사용해 보면...
int _tmain(int argc, _TCHAR* argv[])
{
Base *p = new Derv();
p->TTT();
delete p;
return 0;
} 화면상에 "impl"이라는 문자가 찍힙니다. 잘됩니다. 그렇다면 Base 클래스를 아래처럼 수정합니다.
class Base {
public:
Base() { A(); };
void TTT() {
A();
}
public:
virtual void A() = 0;
}; 변경된 부분은 Base의 생성자에서 순사 가상 함수를 호출하고 있습니다. 실행해보면... 않됩니다. Base::A(void) 외부 기호를 확인할 수 없다는 경고입니다. 원래 C++ 표준도 않되는 것인지.. 아니면 MS의 C++ 만 않되는 것인지는 모르겠지만, 당연히 될줄알고 사용했던지라 매우 난감했습니다. 아무튼 않되는 것을 알았으니 돌아가야겠습니다.
|