#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <map>
#include <set>
#include<algorithm>
using namespace std;
// Modern C++ (C++11 부터 나온 아이들)
// override, final
class Creature {
public:
};
class Player: public Creature {
public:
virtual void Attack() {
cout << "Player Attack!" << endl;
}
virtual void Defence() {
cout << "Player Defence!" << endl;
}
};
class Knight: public Player {
public:
// 재정의(overriding) : 상속받은 함수를 재정의
// Knight 클래스만 보면 이 클래스가 최초로 virtual void Attack()을 선언한지 부모에서 선언한지 알 수 없다.
// 따라서 함수 뒤에 override를 붙여줌으로써 가독성 + 안정성을 부여할 수 있다.
virtual void Attack() override {
cout << "Knight!" << endl;
}
// final
// 함수 뒤에 final을 붙임으로써
// 오버라이딩임을 명시 + 이번 클래스까지만 사용하고
// 자식 클래스들은 override를 할 수 없다는 일종의 봉인을 하는 문법
virtual void Defence() final {
cout << "Player Defence!" << endl;
}
// 아래의 경우는 새로운 함수를 생성한 것!
//virtual void Attack() const {
// cout << "Knight!!!" << endl;
//}
// 헷갈리지 말자!: 오버로딩(overloading) : 함수 이름의 재사용
};
int main()
{
// 편한 관리를 위해 Player로 선언
Player* Pknight = new Knight();
// 하지만 Knight멤버함수를 호출하지 않는 문제가 생김
// 해결을 위해 Player::Atack()을 virtual 함수로 선언함
Pknight->Attack();
// 신입: 혹시 creature가 Attack의 시초인가..?
Creature* CKnight = new Knight();
//CKnight->Attack(); //오류 발생
// 결론 : 오버라이딩을 할 땐 함수 뒤에 override를 붙여주자!
}