C++

virtual , override 키워드

monstro 2024. 3. 18. 01:08
728x90
반응형

C++은 효율 우선주의 언어입니다.

특별한 경우가 없다면, 컴파일 시에 비용이 더 높은 게 있다면 비용이 더  높은 걸 사용합니다.

 

이 특징은 장점일 수도 있고, 단점일 수도 있는 말 그대로 양날의 검인 특징입니다.

처리철차가 간단하고 처리속도 역시 빠르겠지만, 또 그만큼 상황을 제한해버립니다.

 

그렇지만 우리에게는 virtual 과 override라는 2개의 무기로 이 단점을 능숙하게 조련할 수 있습니다. 

 

한번 보겠습니다.

 

자식의 메소드를 사용하려 했지만...

 

Children은 Parent클래스로부터 상속받은 자식 클래스 입니다.

따라서 Parent타입 포인터에 객체 kids의 주소를 넣었다면 우리는 "자식입니다"라는 출력화면을 보았어야 합니다.

하지만, 출력은 "엄마, 아빠입니다" 가 되어버렸습니다.

이러한 결과가 발생한 이유는 C++의 효율 우선주의 방침때문입니다.

따라서 자동적으로 부모의 메소드를 실행하게 된 것입니다.

 

이러한 상황을 예방할 수 있는 것이 virtual 과 override입니다.

 

자식의 메소드가 정상적으로 호출되었다!

 

virtual키워드는 포인터가 가리키는 진짜 대상이 누구인지 파악해 대상의 함수를 호출하게 합니다.

이를 Dynamic Dispatch라고 합니다.

 

또 override 키워드는 사용이 강제되지는 않지만, 한번 사용하고 나면 일종의 안전장치로써 작동합니다.

재정의 되야 하는 가상메소드가 부모에 존재하는지 + 또 가상메소드가 자식클래스 안에서 재정의되었는지를 판단하여

빨간색의 에러를 코드에 표현해줍니다.

 

virtual은 C++의 특징 중 하나인 다형성을 구현할 때 매우 중요하게 사용됩니다.

또 override는 프로그래머로 하여금 위험상황을 인지할 수 있게 도움을 줍니다.

 

이러한 키워드들을 다루고 사용하는 데 두려움이 없어지셨으면 좋겠습니다.

 

728x90
반응형

'C++' 카테고리의 다른 글

C++의 캐스팅 - static_cast  (0) 2024.04.08
캐스팅 - C언어의 캐스팅  (0) 2024.04.07
람다  (0) 2024.03.18
함수 객체  (0) 2024.03.11
함수 포인터  (0) 2024.03.11