본문 바로가기
[ C++ ]/- C++ 문법정리

C++ 19 [가상함수, 오버라이딩]

by MRG 2023. 4. 20.
728x90
반응형

▣ 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 

 

바인딩

컴퓨터 프로그래밍에서 각종 값들이 확정되어 더 이상 변경할 수 없는 구속(bind) 상태가 되는 것. 프로그램 내에서 변수, 배열, 라벨, 절차 등의 명칭, 즉 식별자(identifier)가 그 대상인 메모리 주

terms.naver.com

 

 

▣ Player 부모클래스에 hit함수 반환형 앞에  virtual 키워드를 붙여서 가상함수로 정의하고 디버그를 하면

오버라이딩 동적 바인딩(Dynamic binding)되어서 Soldier로 접근한 객체는

int hit(int attack)
{
cout << "Soldier hit 호출" << endl;
return (hp - attack);
}

를 호출하게 된다.

 

▣ 동적 바인딩(Dynamic binding) : 런타임에 호출될 함수가 결정되는 것

 

▣ 오버라이딩 : 상속 관계에 있는 부모클래스에 이미 정의된 함수를 자식 클래스가 부모클래스의 함수를 재정의한 걸 자신에 맞게 사용하는 걸 의미(가상함수)

 

https://ko.wikipedia.org/wiki/%EB%A9%94%EC%86%8C%EB%93%9C_%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9

 

메소드 오버라이딩 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 메소드 오버라이딩 그림. 메소드 오버라이딩,(method overriding)은 객체 지향 프로그래밍에서 서브클래스 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래

ko.wikipedia.org

 

▣ 범위지정자를 이용해서 부모클래스의 가상 함수를 직접 지정해서 호출할 수 있다.

 

 

▣ 또한 범위지정자를 이용해서 전역변수, 지역변수를 지정해서 접근할 수 있다.

 

▣ 일반적으로 상속한 상태에서 클래스를 할당받고 제거하게 되면 부모클래스만 삭제되지만

부모클래스, 자식클래스의 소멸자에 virtual 가상함수로 지정하게 되면 같이 소멸된다.

728x90
반응형

'[ 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

댓글