[C++] 순수 가상 함수와 추상 클래스

2024. 6. 27. 22:34·Programming Language(Sub)/C++

순수 가상 함수(pure virtual function)와 추상 클래스(abstract class)

  • 이전 시간까지 가상 함수에 대해서 배웠다.

    • 아래 예시와 같이 가상 함수를 통해 오버라이딩을 할 수 있었다.
#include <iostream>
using namespace std;

class A {  
   public:
    virtual void f() {}
};

class B : public A {
   public:
    void f() {}
};

int main() {
    A *a = new B;
    a->f();
    delete a;
}
  • 순수 가상 함수란 무엇인가요?

    • 가상이라는 것은 실제로는 존재하지 않는다는 의미인데, 이전 시간에서 다뤘듯 부모타입 포인터 변수가 부모타입 객체를 가리키면, 가상 함수 호출이 가능했다
    • 그래서 완전히 존재하지 않는 함수로 만들어 주기 위해, 순수 가상 함수를 사용한다.
class A {  // 추상클래스
   public:
         // 순수 가상함수
    virtual void f() = 0;  // 0 또는 NULL
};
  • 순수 가상 함수를 포함하고 있는 클래스는 그 타입을 갖는 인스턴스를 만들 수 없다.

    • 이러한 클래스를 추상 클래스라고 부른다
A *a = new A; // 에러 발생
  • 자식 인스턴스를 생성하는 것은 가능하다.
int main() {
        A *a = new B;
        a->f();
        delete a;
}

어떤 상황에서 순수 가상 함수를 사용하면 좋을까?

Example) 두 가지 도형 Circle, Rectangle이 있다고 해보자.

#include <iostream>

using namespace std;

const double PI = 3.1415;

class Circle {
   public:
    Circle(double r) : r(r) {}

    double GetArea() {
        return PI * r * r;
    }

    void Resize(double f) {
        r *= f;
    }

   private:
    double r;
};

class Rectangle {
   public:
    Rectangle(double a, double b) : a(a), b(b) {}

    double GetArea() {
        return a * b;
    }
    void Resize(double f) {
        a *= f;
        b *= f;
    }

   private:
    double a, b;
};
  • 두 클래스를 Shape라는 클래스에 한꺼번에 어딘가에 저장해주고 싶다.
Shape *shapes[] = {
        new Circle(10),
        new Rectangle(20, 30)
};
  • Shape라는 클래스로 뽑아내보자
class Shape {
   public:
    virtual double GetArea() {
                // 어떤 것을 리턴해야 할까?
        }
    virtual void Resize(double f) {
        }
};
  • 물론 shape의 GetArea()를 호출할 일은 없지만, 만약 실수를 해서 호출해버리게 된다면 virtual double GetArea()에서, 리턴해줄 것이 없다.

    • 이런 경우를 대비해서, 순수 가상 함수로 선언하여 추상 클래스로 만들어준다 --> 인스턴스를 만드는 것을 방지
class Shape {
   public:
    virtual double GetArea() = 0;
    virtual void Resize(double f) = 0;
};
  • 이제, 여러 개의 도형을 for문을 통해서 다뤄보자
int main() {
    Shape *shapes[] = {
        new Circle(10),
        new Rectangle(20, 30)};
    for (Shape *s : shapes) {
        s->Resize(2.0);
    }
    for (Shape *s : shapes) {
        cout << s->GetArea() << endl;
    }

    for (Shape *s : shapes) {
        delete s;
    }
}

참조) 두들낙서 C/C++ 강좌

'Programming Language(Sub) > C++' 카테고리의 다른 글

[C++] 상속에서의 형변환 - 업캐스팅(Upcasting)  (0) 2024.06.27
[C++] 생성/소멸자 실행 순서와 가상 소멸자  (0) 2024.06.27
[C++] 상속이 필요한 이유(2)  (0) 2024.06.27
[C++] 가상 함수(Virtual Function)와 동적 바인딩(Dynamic Binding)  (0) 2024.06.27
[C++] 오버라이딩(Overriding)과 정적 바인딩(Static Binding)  (0) 2024.06.27
'Programming Language(Sub)/C++' 카테고리의 다른 글
  • [C++] 상속에서의 형변환 - 업캐스팅(Upcasting)
  • [C++] 생성/소멸자 실행 순서와 가상 소멸자
  • [C++] 상속이 필요한 이유(2)
  • [C++] 가상 함수(Virtual Function)와 동적 바인딩(Dynamic Binding)
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[C++] 순수 가상 함수와 추상 클래스
상단으로

티스토리툴바