본문 바로가기
전공공부/C, C++

[C++] 11. C++ Class Virtual Function

by 아임그류튜 2024. 7. 3.
반응형

부모 객체는 자식 객체에 넣을 수 있고 자식 객체는 부모 객체에 넣을 수 없습니다.

 

왜지?? 부모객체가 더 상위 개념이면 품을 수 있는거 아닌가요??

답은. 자식이 더 많은 멤버를 가졌기 때문입니다.

 

따라서 대입연산자를 사용하면 Slicing / 즉, 멤버가 일부 잘리는 문제가 발생됩니다.

 

포인터를 사용하면 대입 가능합니다!

하지만 단순한 주소 참조가 되어 버리기 때문에 멤버에는 접근이 불가하고

재정의된 함수를 사용할 시 잘못된 호출이 되어버립니다.

이러한 문제를 해결하기 위해서는 virtaul 함수를 사용합니다.

virtual 함수는 Dynamic(late) Binding이라고 말합니다.

동적으로 늦게, 객체의 외부가 아닌 내부를 보고 판단하는 함수입니다.

 

사용방법으로는 부모의 멤버함수에 virtaul keyword를 붙여주고

자식의 멤버함수에서 overriding 해줍니다!

 

자식의 멤버에는 virtual keyword를 생략해도 되지만 헷갈리지 않게 붙여주는 것을 추천드립니다.

pure virtual이란 부모 클래스에서는 정의하지 않는 virtual 함수입니다.

또한, Abstract Class(추상 클래스)는 Class 자체가 정의되지 않은 경우로 객체를 생성할 수 없습니다.

 

예를 들어 도형이라는 클래스에 원, 삼각형, 사각형 등의 자식클래스를 만들면

도형이라는 큰 틀에는 객체가 필요가 없을 것 입니다.

그리고 Draw라는 공통적인 멤버함수가 필요할 것입니다.

 

부모 클래스에서 Draw 함수를 virtual로 선언해주고

자식 클래스에서 정의해줍니다.

 

소멸자의 경우도 자식 → 부모 순으로 호출되어야 하지만

부모소멸자가 불릴 위험이 있기에 부모소멸자를 virtual로 선언해줍니다.

반응형