본문 바로가기
프로그래밍 언어/C++

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

by 까망 하르방 2025. 2. 26.
반응형

추상 클래스 (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

댓글