본문 바로가기
프로그래밍/공부

[C++] 가상함수 & 순수가상함수

by Sik.K 2022. 12. 12.

클래스는 내부의 멤버로 변수, 구조체, 함수 등을 가질 수 있다.

 

이 때, 함수를 정의하고 이를 자식 클래스에서 같은 이름, 같은 매개변수의 함수를 사용하기 위해서는 어떻게 해야 할까?

 

이 경우 사용하는 것이 바로 '가상함수' 이다.

 

가상함수란, 클래스의 상속 관계에서 부모 클래스가 자식 클래스에게 같은 이름, 같은 매개변수의 함수를 상속시켜 자식 클래스에서도 사용이 가능하게 끔 하는 것을 의미한다.

 

코드로는 virtual이라는 키워드를 붙여서 사용하게 되는데, virtual이 붙은 함수들은 가상함수 테이블에 그 주소가 등록이 되어 자식 클래스에서 함수를 호출할 때, 위치를 확인하여 찾아갈 수 있게 된다.

 

class Basic
{
public:

	virtual void Print(); // virtual 키워드가 붙어 있기 때문에 이 함수는 가상함수이다.

};

그런데 이 가상함수는 꼭 자식 클래스에서 재정의를 하지 않아도 사용이 가능하다. 이 경우, 만약 재정의를 깜빡하고

자식 클래스에서 그냥 함수를 호출하게 되면 어떤 일이 일어날까?

 

바로 재정의 되지 않은 자신의 함수가 아닌 부모 클래스의 함수가 호출이 된다. 가상함수를 사용하는 이유는 상속 관계에서 객체마다 다르게 함수를 사용하기 위해서 사용하는 것인데 부모 클래스를 호출하게 되면 가상함수를 사용하는 의미가 없어진다.

 

이런 일을 방지하기 위해서 만들어진 것이 바로 '순수가상함수' 이다.

 

순수가상함수란, 반드시 상속 받은 자식 클래스에서 재정의가 이뤄져야 하는 가상함수를 의미한다.

 

class Basic
{
public:

	virtual void Print() = 0; /* 함수를 선언하고 뒤에 '= 0' 붙이게 되면 반드시 자식 클래스에서 재정의를 해줘야 하는 순수가상함수가 된다. */


};

만약 상속 받은 순수가상함수를 정의하지 않고 객체를 선언하게 된다면 오류가 발생한다. 때문에 개발자는 이를 확인하고 재정의를 해줘야 하는 것을 잊지 않을 수 있게 된다.

'프로그래밍 > 공부' 카테고리의 다른 글

[C++] 싱글턴 패턴  (0) 2022.12.13
[C++] 정적(Static) 변수  (0) 2022.12.13
[C++] 비트 연산자  (0) 2022.12.13
[그래픽스] 더블 버퍼링(Double Buffering)  (0) 2022.12.12
[C++] 추상클래스 and 인터페이스  (0) 2022.12.12

댓글