ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Tip : static 메서드 호출 / 디폴트 인자 상속
    @ 16. 1 ~ 17. 1/C++ 2014. 4. 28. 22:13

    class A
    {
    public:
     static void show()
     {
      cout << "에이 쇼" << endl;
     }
     virtual void showdata()
     {
      cout << "에이 쇼데이타" << endl;
     }
    };

    class B : public A
    {
    public:
     static void show()
     {
      cout << "비 쇼" << endl;
     }
     virtual void showdata()
     {
      cout << "비 쇼데이타" << endl;
     }
    };

    int main()
    {
    1번

     A a;
     a.show();
     B b;
     b.show();

     A *ptr;
     ptr=&b;
     ptr->show();

     A &ref=b;
     ref.show();

    결과

    에이 쇼

    비 쇼

    에이 쇼

    에이 쇼

     

    2번

    A a;

    a.showdata();

    B b;

    b.showdata();

    A *ptr;

    ptr=&b;

    ptr->showdata();

    A &ref=b;

    ref.showdata();

     

    결과

    에이 쇼데이타

    비 쇼데이타

    비 쇼데이타

    비 쇼데이타

     

    1번과 2번의 차이점은 무엇인가?

    C++에서는 객체가 무엇이든 관계없이 접근하는 타입에 맞추어 호출할 static메서드를 결정한다.

    즉 실제 객체가 무엇인지는 상관이 없다는 것.

    객체를 통해 호출될 때는 실제 객체의 타입과는 관계없이 그 객체를 참조하고 있는 타입만이 호출할 메서드를 결정한다.

     

    * 메서드가 static이면서 동시에 virtual일 수는 없다.

     


    C++에서 디폴트 인자 값을 결정할 때 실제 이용된 객체는 보지 않고 코드에서 표현된 타입만 보기 때문이다.

    이때문에 디폴트 인자 값은 C++에서 상속되지 않는다. 위의 예를 들어

    B객체를 A타입 포인터 또는 참조로 접근하여 오버라이딩된 디폴트 메서드를 호출하면

    바디부분은 B객체것이 디폴트 인자는 A에서 정의한것이 적용된다.

    * 디폴트 인자값이 있는 메서드를 오버라이딩할때는 항상 같은 값으로 디폴트 인자를 정의해주는 것이 바람직하다.

Designed by Tistory.