Programming Language/C,C++

C++] 추상 클래스

TwinParadox 2017. 6. 26. 12:00
728x90





추상클래스 구현에 앞서, 순수가상함수에 대해 알아볼 필요가 있다.

순수 가상 함수(pure virtual function)는 함수의 코드 없이 선언만 있는 가상 함수로,

멤버 함수의 원형 뒤에 =0;로 선언하는 형태를 가진다.


 

1
2
3
4
5
class Shape
{
public:
    virtual void draw()=0;
};
cs





추상클래스(Abstract class)


최소 하나의 순수 가상 함수를 가진 클래스


실행 코드가 없는 순수 가상 함수를 가지고 있어 불완전한 클래스이므로,

추상 클래스에 대한 객체 생성이 불가능하며 컴파일 오류가 발생함.

그러나 추상 클래스에 대한 포인터 선언은 문제되지 않음


추상클래스의 기본적인 목적은 객체 생성이 아니라, 상속을 위한 것이며 이를 활용하는 것이 목적

순수 가상 함수를 통해 파생 클래스의 함수 원형을 보여주는 인터페이스 역할


추상클래스 구현을 위해서는 파생 클래스가 모든 순수 가상 함수를 오버라이딩해 구현해야함


 


#include <iostream>
using namespace std;
class Calculator
{
public:
    virtual int add(int a, int b) = 0; // 덧셈
    virtual int subtract(int a, int b) = 0; // 뺄셈
    virtual double average(int a[], int size) = 0; // a[]의 평균값
};
class BasicCalc : public Calculator
{
public:
    int add(int a, int b){ return a + b; }
    int subtract(int a, int b) { return a - b; }
    double average(int a[], int size)
    {
        double sum = 0;
        for (int i = 0; i < size; i++)
            sum += a[i];
        return sum / size;
    }
};
int main()
{
    int a[] = { 1, 2, 3, 4, 5 };
    Calculator *p = new BasicCalc();
    cout << p->add(2, 3) << endl;
    cout << p->subtract(5, 4) << endl;
    cout << p->average(a, 5) << endl;
}


여기서 Calculator 클래스는 추상클래스이며,

BasicCalc의 경우 이를 상속 받은 파생 클래스로,

추상클래스에 선언된 순수 가상 함수를 모두 오버라이딩 하였기 때문에

객체 생성이 가능해지며 main()에서의 동작이 허용됨

728x90