C++에서는 하나 이상의 순수 가상 함수(Virtual Function)를 포함하는 클래스를 추상 클래스(abstract class)라고 합니다.이러한 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가진 함수의 집합을 정의할 수 있게 해줍니다. 즉, 반드시 사용되어야 하는 멤버 함수를 추상 클래스에 순수 가상 함수로 선언해 놓으면, 이 클래스로부터 파생된 모든 클래스에서는 이 가상 함수를 반드시 재정의해야 합니다.
추상 클래스는 동작이 정의되지 않은 순수 가상 함수를 포함하고 있으므로, 인스턴스를 생성할 수 없습니다. 따라서 추상 클래스는 먼저 상속을 통해 파생 클래스를 만들고, 만든 파생 클래스에서 순수 가상 함수를 모두 오버라이딩하고 나서야 비로소 파생 클래스의 인스턴스를 생성할 수 있게 됩니다. 하지만 추상 클래스 타입의 포인터와 참조는 바로 사용할 수 있습니다.
아래 예제는 C++언어에서 추상 클래스를 이용한 예제입니다.
class Animal
{
public:
virtual ~Animal() {} // 가상 소멸자의 선언
virtual void Cry()=0; // 순수 가상 함수의 선언
};
class Dog : public Animal
{
public:
virtual void Cry() { cout << "멍멍!!" << endl; }
};
class Cat : public Animal
{
public:
virtual void Cry() { cout << "야옹야옹!!" << endl; }
};
int main(void)
{
Dog my_dog;
my_dog.Cry();
Cat my_cat;
my_cat.Cry();
return 0;
}
실행 결과
멍멍!!
야옹야옹!!
위 예제에서 추상 클래스인 Animal 클래스는 순수 가상 함수인 Cry() 멤버 함수를 가지고 있습니다. Animal 클래스를 상속받는 파생 클래스인 Dog 클래스와 Cat 클래스는 Cry() 함수를 오버라이딩해야만 인스턴스를 생성할 수 있습니다.
추상 클래스의 용도 제한
C++에서 추상 클래스는 다음과 같은 용도로는 사용할 수 없습니다.
1. 변수 또는 멤버 변수
2. 함수의 전달되는 인수 타입
3. 함수의 반환 타입
4. 명시적 타입 변환의 타입
'공부 > C++' 카테고리의 다른 글
추상 클래스(abstract class)와 인터페이스(interface)의 차이 (0) | 2023.01.31 |
---|---|
인터페이스(interface)의 개념 (0) | 2023.01.25 |
malloc과 new의 차이점, free와 delete의 차이점 (0) | 2023.01.18 |
new와 delete의 개념 및 차이점 (0) | 2023.01.17 |
포인터(pointer)란? (0) | 2023.01.15 |