@ 16. 1 ~ 17. 1/C++

Tip : static 메서드 호출 / 디폴트 인자 상속

namoeye 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에서 정의한것이 적용된다.

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