Modern C++ - override, final

이승덱·2021년 7월 21일
0

CPP

목록 보기
66/70
#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를 붙여주자!

}
profile
공부 기록용 블로그입니다

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN