CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.