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