오늘의논리 2023. 3. 6. 22:29
728x90
using namespace std;


class Creature
{
public:

};
class Player : public Creature
{
public:
	virtual void Attack()
	{
		cout << "Player" << endl;
	}
};

class Knight : public Player
{
public:
	//재정의(override)
	virtual void Attack() const// 이렇게 const 등이 붙이면 재정의가 아니라 새로운 함수가 됨
	{
		cout << "Knight" << endl;
	}

	//오버로딩(overloading) : 함수 이름의 재사용
	void Attack(int a)
	{
		cout << "Knight(int a)" << endl;
	}
private:
	int _stamina = 10;
};

int main()
{
	Player* player = new Knight;
	player->Attack();

	return 0;
}

이때

virtual void Attack() override
{
    cout << "Knight" << endl;
}



이렇게 함수 이름 뒤 override 를 붙여주면 내가 최초가 아니라 부모 클래스에 있는 함수를 오버라이드 하고있다.라는 의미가 된다
당연하게도 부모함수가 없을경우 override를 붙이는것은 불가능
안전장치의 역할을 한다

추가로
부모 클래스에서

class Player : public Creature
{
public:
    virtual void Attack() final
    {
        cout << "Player" << endl;
    }
};

이렇게 final 을 붙여서 막을경우 하위 클래스에서 오버라이드 하는것이 불가능해 진다

728x90