ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메서드 오버라이딩(virtual)의 특수한 경우들
    @ 16. 1 ~ 17. 1/C++ 2014. 6. 28. 23:25

    1. 부모클래스의 메서드가 static인 경우

    C++에서는 static 메서드를 오버라이딩할 수 없다. 라는 사실만으로 알고 있자..ㅎㅎ

     

    2. 부모클래스의 메서드가 오버로딩된 메서드인 경우

    특정 이름과 파라미터로 메서드를 오버라이딩 하면 파라미터와 관계없이 같은 이름을 가지는 부모클래스의 모든 메서드들이 숨겨진다.

    A클래스

    virtual void sh();

    virtual void sh(int i);

     

    B클래스 : public A클래스

    virtual void sh();

     

    하게 되면

    B클래스.sh(1)는 호출이 안된다.

    근데 아래 처럼 포인터로 접근하면..

    B b;

    A *ptr=&b;

    ptr->sh(1) 은 된다..

    또 다른것으로는

    using을 사용하면 오버라이딩 구현을 일부에만 적용하고 나머지는 부모클래스(A)것을 그대로 사용할 수 있다.

     

    B클래스 : public A클래스

    using A::sh;

    virtual void sh();

     

    서로 다른 파라미터로 정의된 해당 메서드의 모든 버전을 오버라이딩 하는게 가장 낫다..

     

    3. private 또는 protected로 선언된 부모클래스의 메서드

    이것은 자식클래스가 부모클래스에게 자식클래스만의 특징적인 부분들을 반영해줄 수 있게 한다.

    아래처럼

    class A
    {
    public:
     A()
     {
     // cout << "A"<< endl;
     }
     virtual void show()
     {
      cout << "AAA"<< returnshow()+10<< endl;
     }
     virtual void show(int i)
     {
      cout << "AAA int i"<< returnshow()+10<< endl;
     }
    private:
     virtual int returnshow()
     {
      return 10;
     }

    };

    class B : public A
    {
    public:
     B()
     {
      //cout << "B" <<endl;
     }
    private:
     virtual int returnshow()
     {
      return 20;

     }
    };

    int main()

     A a;
     a.show();
     B b;
     b.show();
     getch();
     return 0;
    }

    결과는 20, 30

    전반적인 변경이 필요하지 않고 특정 속성만 바꾸면 될 떄는 이 방법도 좋다..

     

    4. 부모클래스의 메서드가 디폴트 인자값을 가진 경우

    결론을 이야기하면 디폴트 인자는 상속이 안된다.

    부모클래스

    a(int i=1);

    자식클래스

    a(int i=2);

    일경우

    부모 a;

    자식 b;

    부모 *ptr=&b;

    a.a는 부모것

    b.a는 자식것

    ptr->a는 실행은 자식것이지만 디폴트 인자는 부모것.

    즉, 실제 이용된 객체와 관계없이 호출될때 어느 클래스 타입을 이용했느냐에 의해 결정됨

     

    '@ 16. 1 ~ 17. 1 > C++' 카테고리의 다른 글

    srand() ..  (0) 2014.07.05
    참조형 관련  (1) 2014.06.30
    업 캐스팅 슬라이싱..  (0) 2014.06.28
    포인터 상속 virtual 객체 자꾸 까먹네.  (0) 2014.06.26
    참조형 관련  (0) 2014.06.24
Designed by Tistory.