💡 추상 클래스
: 기능이 구체적으로 작성되지 않은 클래스. 즉 하나 이상의 순수 가상 함수(pure virtual function)을 지닌 클래스를 지칭한다.
생성하고자 하는 객체들이 반드시 어떤 기능을 가져야한다면, 그 기능을 추상 클래스의 순수 가상 함수로 작성해놓고, 해당 클래스를 이용해 만든 자식클래스(생성하고자 하는 객체)에서는 이 가상 함수를 재정의하여 사용해 기능을 구현한다.
추상 클래스는 객체를 생성하기 위한 목적의 클래스가 아니라 상속을 통한 다양한 클래스의 생성을 위한 인터페이스인 셈.
추상 클래스는 기능이 정의되지 않은 순수 가상 함수를 포함하고 있기 때문에 불완전한 클래스로 볼 수 있다. 따라서 추상 클래스에 대한 객체는 생성불가능.
#include <iostream>
class Test {
private:
int num;
public:
virtual ~Test() {}
virtual void func() = 0;
};
int main() {
//COMPILE ERROR!
Test *test = new Test;
}
그럼 어떻게 객체를 생성하지? 추상 클래스를 상속 받은 자식클래스를 만들고 자식클래스에서 오버라이딩을 통해 순수 가상함수를 실제로 구현해서 인스턴스 생성한다.
추상 클래스의 타입의 포인터와 참조는 선언 가능함.
#include <iostream>
class Animal {
public:
virtual ~Animal() {} //가상 소멸자 선언
virtual void cry() = 0; //순수 가상 함수 선언
};
class Dog : public Animal {
public:
virtual void cry() {
std::cout << "bark!" << std::endl;
}
};
class Cat : public Animal {
public:
virtual void cry() {
std::cout << "meaw~" << std::endl;
}
};
int main() {
Cat cat;
Dog dog;
cat.cry();
dog.cry();
return (0);
}