추상 클래스 (abstract class)
→ 순수 가상함수가 한 개 이상 있는 클래스
순수 가상 함수 (pure virtual function)
→ 구현이 없고, 「= 0」 으로 끝나는 가상함수
추상 클래스 특징
→ 객체를 생성할 수 없다.
→ 포인터 변수는 만들 수 있다.
class Shape
{
public:
virtual void Draw() = 0; // 순수 가상함수 (pure virtual function)
};
int main()
{
Shape s1; // error (추상 클래스는 객체를 만들 수 없다.)
Shape s2*; // ok (객체 자체는 안되지만 포인터는 만들 수 있다.)
}
why? 추상 클래스
파생클래스로 하여금 순수 가상함수를 override 해서 구현부 제공해야 한다.
"구체(Concrete) Class"라고도 한다.
class Shape
{
public:
virtual void Draw() = 0; // 순수 가상함수 (pure virtual function)
};
class Rect : public Shape
{
public:
virtual void Draw() {};
};
int main()
{
Rect r;
}
순수 가상함수를 구현하지 않으면
파생 클래스도 추상 클래스일 뿐!
class Shape
{
public:
virtual void Draw() = 0; // 순수 가상함수 (pure virtual function)
};
class Rect : public Shape
{
};
int main()
{
Rect r; // ?? -> error
}
가상 함수 vs 순수 가상 함수
• 가상 함수: 파생 클래스가 반드시 재정의 할 필요는 없다.
재정의 하지 않으면 기본 구현 제공
• 순수 가상함수: 파생 클래스가 반드시 구현을 제공해야 한다.
#include <iostream>
#include <iostream>
class Animal
{
public:
// 가상함수
virtual void cry() { std::cout << "Animal Cry..." << std::endl; } // ??? -> 1
// 순수 가상함수
virtual void cry() = 0; // ??? -> 2
};
class Dog : public Animal
{
public:
virtual void cry() override { std::cout << "Dog Cry..." << std::endl; }
};
int main()
{
Dog d;
Animal* p = &d;
p->cry();
}
Q) 모든 동물(Animal) 각자의 소리(Cry)가 있다고 가정해보자.
기반 클래스 Animal에 ①, ② 중 어떤 것이 맞을까?
A) 순수가상함수(②)
→ 파생 클래스에 cry() 구현하도록 하는게 적합
재정의를 강요하는 특성으로
순수 가상함수의 남용은 자율적인 프로그램 개발을 저해할 수 있다.
📌 [C++] 가상 함수 (virtual funciton)
[C++] 가상 함수 (virtual funciton)
가상 멤버 함수 (virtual function)동적 바인딩을 위해 사용class A{public: virtual void sub(void);}; [예제] 함수 재정의(overriding) 주의사항#include class Animal{public: void Cry() { std::cout Cry(); // ??? -> Dog? Animal?}Q) p-
zoosso.tistory.com
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] RTTI (Run-Time Type Information) (1) | 2025.02.28 |
---|---|
[C++] 가상함수와 디폴트 파라미터 (1) | 2025.02.27 |
[C++] 가상 소멸자 (3) | 2025.02.24 |
[C++] 함수 바인딩 (Funciton Binding) (3) | 2025.02.22 |
[C++] mutable 키워드 (1) | 2025.02.21 |
댓글