-
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에서 정의한것이 적용된다.
* 디폴트 인자값이 있는 메서드를 오버라이딩할때는 항상 같은 값으로 디폴트 인자를 정의해주는 것이 바람직하다.
'@ 16. 1 ~ 17. 1 > C++' 카테고리의 다른 글
포인터 상속 virtual 객체 자꾸 까먹네. (0) 2014.06.26 참조형 관련 (0) 2014.06.24 Tip : 메모리 해제, static 메서드 (0) 2014.04.27 Tip : 반환형이 참조형인 경우 (0) 2014.04.26 Tip : 생성자 초기화 리스트와 생성자 바디에서의 초기화 차이 (1) 2014.04.26