1. 오버라이드(override)
(1) 멤버 함수 오버라이딩
자식 클래스 안에서 부모 클래스의 멤버 함수를 재정의 하는 것.
class Player
{
public:
void attack()
{
cout << "Player" << endl;
}
};
class Knight : public Player
{
public:
void Attack()
{
cout << "Knight" << endl;
}
private:
int _hp = 100;
};
int main()
{
Knight* knight = new Knight();
knight->Attack();
// knight의 Attack()이 호출됨
}
여기에서 Knight 객체를 Player 형의 포인터 타입으로 만들면
int main()
{
Player* player = new Knight();
player->Attack();
}
클래스 Player의 Attack()이 호출된다.
이 때 부모 클래스 Player의 Attack을 가상 함수로 만들어주면
class Player
{
public:
virtual void Attack()
{
cout << "Player" << endl;
}
};
자식 클래스 Knight의 Attack이 호출된다.
이 때 자식 클래스의 Attack도 가상 함수로 인식이 된다(암시적).
(2) 멤버 함수를 최초로 사용한 클래스가 누구인가?
자식 클래스의 Attack도, 부모 클래스의 Attack도 가상 함수이므로 어떤 Attack이 처음 사용된 것인지 알 수가 없다.
(함수가 오버라이딩 된 것인지 아니면 자식 클래스에서 새로이 선언된 것인지 알 수 없음)
(3) override의 사용
따라서 자식 클래스의 멤버 함수의 뒤에 override를 붙여두어서 해당 함수를 부모로부터 상속받았다는 것을 명시할 수 있다.
또한 상위 클래스가 해당 함수가 없을 때 자식 클래스에서 override를 붙이면 오류를 발생시키므로 안전 장치의 역할을 할 수 있다.
따라서 오버라이딩 할 때는 꼭 끝에 override를 붙여주는 습관을 가지는 것이 좋다.
2. final
override 이후 더 이상 해당 멤버 함수를 상속하지 않겠다고 선언한다.
따라서 그 이후의 자식 클래스에서는 final이 선언된 멤버 함수는 사용할 수 없다.
'기초 C++ 스터디 > 모던 C++' 카테고리의 다른 글
10-8. 전달 참조 (forwarding reference) (0) | 2023.06.22 |
---|---|
10-7. 오른값 참조(Rvalue Reference) (0) | 2023.06.22 |
10-5. delete - 삭제된 함수 (0) | 2023.06.20 |
10-4. enum class (0) | 2023.06.20 |
10-3. nullptr (0) | 2023.06.20 |