본문 바로가기
개발/C, C++

C++ - 순수 가상 클래스 (Pure Virtual Class)

by 피로물든딸기 2021. 11. 10.
반응형

C, C++ 전체 링크

 

순수 가상 클래스는 순수 가상 함수를 가지는 클래스다.

순수 가상 함수는 virtual로 선언하고 끝에 = 0;이라고 표시한 함수다.

즉, 선언만 해두고 정의는 자식 클래스에 강요한다.

 

아래는 FOOD의 순수 가상 클래스다.

#include <stdio.h>
#include <iostream>

using namespace std;

class FOOD
{
public:
	FOOD() { cout << "FOOD Constructor" << endl; }
	virtual ~FOOD() { cout << "FOOD deleted " << endl; }

	virtual int getPrice() const = 0; /* 순수 가상 함수 */
	virtual void setPrice(int value) = 0;
};

 

순수 가상 함수가 하나라도 있다면 인스턴스 생성이 불가능하다. 아래의 주석 코드는 컴파일 에러가 발생한다.

int main(void)
{
	// 순수 가상 함수가 하나라도 있다면 인스턴스 생성 불가
	//FOOD fd;
	//FOOD* fd = new FOOD();
    
	return 0;
}

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

그렇지 않고 인스턴스를 생성하면 컴파일 오류가 발생한다.

 

SNACK이 FOOD 클래스의 자식이지만 virtual 함수를 모두 오버라이딩하지 않았다.

아래 주석을 해제하면 컴파일 에러가 발생한다.

class SNACK : public FOOD
{
private:
	int price = 1000;
public:
	SNACK() { cout << "SNACK Constructor" << endl; }

	virtual ~SNACK() { cout << "SNACK deleted " << endl; }
};

int main(void)
{
	// 순수 가상 클래스의 자식 클래스의 순수 가상 함수를 반드시 재정의
	// SNACK snack;

	return 0;
}

 

아래와 같이 SNACK에 오버라이딩을 모두 해주면 정상적으로 컴파일 된다.

class SNACK : public FOOD
{
private:
	int price = 1000;
public:
	SNACK() { cout << "SNACK Constructor" << endl; }

	virtual ~SNACK() { cout << "SNACK deleted " << endl; }
	virtual int getPrice() const { return price; }
	virtual void setPrice(int value) { price = value; }
};

int main(void)
{
	SNACK snack;

	cout << snack.getPrice() << endl;

	return 0;
}

 

최종 코드는 아래와 같다.

#include <stdio.h>
#include <iostream>

using namespace std;

class FOOD
{
public:
	FOOD() { cout << "FOOD Constructor" << endl; }
	virtual ~FOOD() { cout << "FOOD deleted " << endl; }

	virtual int getPrice() const = 0;
	virtual void setPrice(int value) = 0;
};

class SNACK : public FOOD
{
private:
	int price = 1000;
public:
	SNACK() { cout << "SNACK Constructor" << endl; }

	virtual ~SNACK() { cout << "SNACK deleted " << endl; }
	virtual int getPrice() const { return price; }
	virtual void setPrice(int value) { price = value; }
};

int main(void)
{
	SNACK snack;

	cout << snack.getPrice() << endl;

	return 0;
}
반응형

댓글