본문 바로가기

C++

[C++] 추상 클래스 (abstract class)

이번 시간에는 추상 클래스에 대해서 알아보겠습니다.

 

#include <iostream>

class Animal
{
public:
    Animal() { std::cout << "Animal 생성자 호출" << std::endl; }
    virtual ~Animal() { std::cout << "Animal 소멸자 호출" << std::endl; }
    // Speak() = 0, 는 무엇을 하는지 정의되지 않은 함수입니다
    // 반드시 오버라이딩 되도록 만든 함수를 완전한 가상 함수라 해서,
    // 순수 가상 함수(pure virtual function)라고 부릅니다
    virtual void Speak() = 0;
};

class Dog : public Animal
{
public:
    Dog() : Animal() { std::cout << "Dog 생성자 호출" << std::endl; }
    virtual ~Dog() { std::cout << "Dog 소멸자 호출" << std::endl; }
    void Speak() { std::cout << "왈왈~~!" << std::endl; }
};

class Cat : public Animal
{
public:
    Cat() : Animal() { std::cout << "Cat 생성자 호출" << std::endl; }
    virtual ~Cat() { std::cout << "Cat 소멸자 호출" << std::endl; }
    void Speak() { std::cout << "야옹~~" << std::endl; }
};

int main()
{
    Animal *dog = new Dog();
    Animal *cat = new Cat();

    dog->Speak();
    cat->Speak();

    delete dog;
    delete cat;
}

 

 

Animal 클래스는 순수 가상함수(speak 함수)를 가지고 있어서 인스턴스를 생성할 수 없다.

그리고 상속을 받은 클래스(Dog, Cat 클래)에서는 순수 가상함수를 반드시 오버라이드 해야만 합니다.

Dog, Cat 클래스에서는 Speak 함수를 반드시 구현해야 한다.

 

추상 클래스는 객체를 만들 수 없으며 사용하기 위해서는 다른 클래스에 상속 해줘야 하며, 추상 클래스를 '설계도' 라고 생각하면 좋다. 

직접 객체를 만들수는 없지만 포인터는 만들수 있다(Animal *dog, Animal *cat 과 같이 구현 가능함).

 

 

실행결과

 

$ sh ../g.sh virtual_function
Animal 생성자 호출
Dog 생성자 호출
Animal 생성자 호출
Cat 생성자 호출
왈왈~~!
야옹~~
Dog 소멸자 호출
Animal 소멸자 호출
Cat 소멸자 호출
Animal 소멸자 호출