이번 시간에는 추상 클래스에 대해서 알아보겠습니다.
#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 소멸자 호출
'C++' 카테고리의 다른 글
[C++] 다중 상속(multiple inheritance) (0) | 2023.02.18 |
---|---|
[C++] 상속(inheritance) - up casting, virtual (0) | 2023.02.17 |
[C++] 상속(inheritance) - protected, private 키워드 (0) | 2023.02.16 |
[C++] 상속(inheritance) (0) | 2023.02.16 |
[C++] 포인터 - 연산자 오버로딩(overloading) (0) | 2023.02.14 |