Tip : static 메서드 호출 / 디폴트 인자 상속
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에서 정의한것이 적용된다.
* 디폴트 인자값이 있는 메서드를 오버라이딩할때는 항상 같은 값으로 디폴트 인자를 정의해주는 것이 바람직하다.