본문 바로가기
Programming/C, C++

C++ 가상 함수(Virtual Function), 순수 가상 함수(Pure Virtual Function)

by Dev_카페인 2022. 11. 18.
반응형

[C++] 가상 함수(Virtual Function), 순수 가상 함수(Pure Virtual Function)

 

가상 함수(Virtual Function)와 순수 가상함수(Pure Virtual Function)

공통점

1. 클래스 상속 관계에서 사용된다.

2. 멤버 함수를 재정의 할 수 있다. (오버라이딩)

 

차이점

1. 순수 가상 함수는 자식 클래스에서 반드시 재 구현해야 한다.

2. 가상 함수는 부모 클래스에서 구현부를 포함하고 있기 때문에 재 구현을 꼭 필요로 하지 않는다.

3. 순수 가상 함수는 함수 선언 뒷 부분에 " = 0 "를 추가 해야 한다.

4. 추상 클래스는 객체를 생성할 수 없다.

5. 순수 가상 함수는 함수의 구현부가 없다. (자식 클래스에게 인터페이스만을 제공한다.)

   > 구현부를 넣어봤는데 이게 되네?하는게 있음...

 

참고 사항

1. 순수 가상 함수를 가지고 있는 부모 클래스를 추상 클래스라고 부른다.

2. 가상 함수를 재 정의한 후에 부모 클래스에 있는 함수를 호출하고 싶다면 함수 앞 부분에 (부모클래스명::)을 붙여준다.

 

 

#include <iostream>
using namespace std;

// 가상 함수 클래스
class VirtualFunction
{
public:
	virtual void Test()
	{
		cout << "VirtualFunction" << endl;
	}
};
// 순수 가상 함수 클래스
class PureVirtualFunction
{
public:
	// 순수 가상 함수 
	virtual void Test() = 0;
	/*virtual void Test() = 0
	{
		이게 되네??????
		cout << "PureVirtualFunction" << endl;
	}*/
};

// 가상 함수 클래스 상속
class ChildClass : public VirtualFunction
{
public :
	// 오버라이딩
	void Test()
	{
		cout << "VirtualFunction Overriding" << endl;
	}
};

// 순수 가상 함수 클래스 상속
class PureChildClass : public PureVirtualFunction
{
public:
	// 오버라이딩
	void Test()
	{
		cout << "PureVirtualFunction Overriding" << endl;
	}
};

int main()
{
	ChildClass cc;
	PureChildClass pcc;
	VirtualFunction vf;	// 객체 생성 가능
	//PureVirtualFunction pvf;	// 객체 생성 불가
	cc.Test();	// 오버라이딩 된 결과 출력
	cc.VirtualFunction::Test();		// 부모 클래스에 있는 가상 함수 출력
	pcc.Test();	// 오버라이딩 된 결과 출력

	return 0;
}

 

 

반응형