-
메서드 오버라이딩(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