[ CnUnix ] in KIDS 글 쓴 이(By): zeo (ZeoDtr) 날 짜 (Date): 1994년02월17일(목) 19시53분33초 KST 제 목(Title): polymorphism...삐거덕. 아, 나와 같이 퇴근할 아저씨가 실장님께 붙잡혔다... 최소 20분 정도 걸린다나... 내가 빈대족이니 어쩔 수 없이 기다려야겠네잉... 그래서, 위의 기마토끼님의 글 (polymorphism) 에 대해 잠깐 뱀다리를 달고자 합니다. 기마토끼님이 윗글의 엄밀성에 대해 책임질 수 없다고 하셨지만, 이상하다고 생각되는 것에 대해 예를 들어 볼려고요. (비방...같은 거 절때 아님! 그냥 서로서로 알고 지나가자라는 거예요...) 기마토끼님께서 > virtual function이 선언되지 않으면 compile error가 나게 됩니다. 라고 쓰신 거에 대해, 제가 요대목을 제대로 이해했다면, 사실이 아닌 것 같네요. 같은 이름 (인수도 같음) 의 멤버 함수가 base와 derived 클래스에 동시에 정의되어 있을 때, 그 함수가 virtual이건 아니건에 상관 없이 컴파일 에러는 안납니다. 적법한 코딩이란 거죠. 단, 아주 후진 side effect가 있습니다. 다음의 예를 보면, CUT HERE============================ #include <iostream.h> class A { public: int i; virtual void vf() { cout << "A::vf\n"; } void nvf() { cout << "A::nvf\n"; } }; class B : public A { public: int j; virtual void vf() { cout << "B::vf\n"; } void nvf() { cout << "B::nvf\n"; } }; int main() { A *a = new A; A *b = new B; // normal call (virtual & non-virtual) a->vf(); b->vf(); a->nvf(); b->nvf(); // call base class' vf - 1st method b->A::vf(); // call base class' vf - 2nd method ((A*)b)->vf(); return 0; } CUT HERE============================ vf는 virtual 함수고 nvf는 아니죠. 이거 컴파일 잘됩니다. 그리고, 결과는 A::vf B::vf A::nvf A::nvf A::vf B::vf 여기서, 위의 네줄의 결과를 보면 어느게 후진 side effect인지 나오지요. virtual 함수가 아닌 경우 그냥 그 pointer의 data type (여기서는 A) 의 것을 call합니다. 아아, 되다만 polymorphism... 하지만, 이것도 필요하니까 이런 기능을 넣어 둔 거겠죠. 그리고 밑의 두줄은 좀 다른 이야기인데요, 제가 b object를 가지고 억지로 A의 virtual 함수를 call하려고 했을 때의 것이죠. 여기서 두번째 방법이 틀린 거죠. 저는 이 결과가 재밌었어요. 그래서 괜히 덩달아 썼다... C++ 초보자인 저로서는 뭐가 헷갈리면 무조건 요런 쬐끄만 예제를 만들어서 시험을 해 봐요. 이렇게 하는 게 저뿐은 아니겠지만. 근데 C++은 정말 헷갈리는 부분이 많다...(내가 머리가 나쁜가?) 덧붙임: 기마토끼님, 괜히 걸구 넘어져서 미안해요. 집에 가려고 맘먹은 차에 다시 일하기도 그렇고 해서... 글이나 한번 써 봤어요, 하하. 잉, 근데 빈대키우는 아저씨는 아직도 실장님이랑 놀고(?) 있다... 난 언제나 빈대 신세 면하나? 면허증도 없는디... ZZZZZZ zZZ eeee ooo zZ Eeee O O ZZZZZZ Eeee OoO |