▣ Player 부모클래스, Soldier자식클래스 같은 hit() 함수 정의, 이걸 함수재정의, 함수오버로딩이라고 한다.
▣ 그럼 위에 주석처럼 Soldier자식클래스는 Player에 멤버를 상속받는다.
▣ Player player;
Soldier soldier;
Player* pplayer = new Player;
Player* pSoldier = new Soldier;
코드를 통해서 객체를 포인터로 state() 함수에서 hit를 호출하게 되면
class Soldier : public Player 상속
int hit(int attack)
{
cout << "Soldier hit 호출" << endl;
return (hp - attack);
}
int hit(int attack)
{
cout << "Player hit 호출" << endl;
return (hp - attack);
}
int state(int attack)
{
cout << "Player state 호출" << endl;
return(hit(attack)*2);
}
이렇게 상속받은 Soldier는 함수오버로딩으로 Player에
int hit(int attack)
{
cout << "Player hit 호출" << endl;
return (hp - attack);
}
함수를 호출하게 된다.
컴파일러가 가장 가까운 함수를 호출한 것이다. 이게 정적바인딩(Static binding)이다.
▣ 정적바인딩(Static binding) : 컴파일 타임에 호출될 함수를 결정한다.
https://terms.naver.com/entry.naver?docId=849926&cid=42346&categoryId=42346
▣ Player 부모클래스에 hit함수 반환형 앞에 virtual 키워드를 붙여서 가상함수로 정의하고 디버그를 하면
오버라이딩 동적 바인딩(Dynamic binding)되어서 Soldier로 접근한 객체는
int hit(int attack)
{
cout << "Soldier hit 호출" << endl;
return (hp - attack);
}
를 호출하게 된다.
▣ 동적 바인딩(Dynamic binding) : 런타임에 호출될 함수가 결정되는 것
▣ 오버라이딩 : 상속 관계에 있는 부모클래스에 이미 정의된 함수를 자식 클래스가 부모클래스의 함수를 재정의한 걸 자신에 맞게 사용하는 걸 의미(가상함수)
▣ 범위지정자를 이용해서 부모클래스의 가상 함수를 직접 지정해서 호출할 수 있다.
▣ 또한 범위지정자를 이용해서 전역변수, 지역변수를 지정해서 접근할 수 있다.
▣ 일반적으로 상속한 상태에서 클래스를 할당받고 제거하게 되면 부모클래스만 삭제되지만
부모클래스, 자식클래스의 소멸자에 virtual 가상함수로 지정하게 되면 같이 소멸된다.
'[ C++ ] > - C++ 문법정리' 카테고리의 다른 글
C++ 21 [템플릿] (0) | 2023.04.21 |
---|---|
C++ 20 [추상클래스, 순수가상함수] (0) | 2023.04.20 |
C++ 18 [상속, 다중상속, 가상상속] (0) | 2023.04.19 |
C++ 17 [연산자 오버로딩] (0) | 2023.04.14 |
C++ 16 [객체 반환] (0) | 2023.04.13 |
댓글