상세 컨텐츠

본문 제목

순수가상함수와 추상클래스

C++/다형성

by nowpassion 2008. 5. 5. 14:20

본문

1. 순수가상함수(Pure Virtual Function)
- 선언방법 : virtual void a() = 0;
- 해당 클래스에서는 사용되지 않습니다.
- 실제 오버로딩된 부분에서 정의하여 사용하면 된다. 즉 상속받은 클래스에서
  새로 정의하여 사용합니다.

2. 추상클래스(Abstract Class)
- 순수가상함수를 하나이상 가지고 있는 클래스를 추상클래스라고 합니다.
- 추상클래스라는 말과 같이 실제 메모리에 인스턴스화되어 저장되는 것이 아니기 때문에
  이를 구현할려면 당연히 자식(파생)클래스를 이용하여 구체화하는 작업이 필요합니다.
- 실제 이를 인스턴스화 할려고 하면 컴파일 오류가 발생합니다.

3. 장점
- 여러 계층 관계에서 순수가상함수와 추상클래스는 인터페이스의 의미를 지니고 있다고
  할 수 있습니다. 당연히 인터페이스의 역할답게 어떤 타입의 개념이라고 받아들일 수 있는
  장점이 있다고 볼 수 있습니다. 또한 실제 인스턴스화가 되지 않기 때문에 실행속도가
  올라가는 효과가 있습니다.

ex) /*33.cpp*/
#include <iostream>
using std::endl;
using std::cout;
/*순수가상함수를 포함한 추상클래스*/
/*draw()함수를 Overriding을 하기 위한 정의*/
class Shape
{
private:
   
public:
    virtual void draw() const = 0;
};

class Point : public Shape
{
    int x_ptr;
    int y_ptr;
   
public:
    Point(int _x = 0, int _y = 0){
        x_ptr = _x;
        y_ptr = _y;
    }
     
    void getPoint(){
        cout << "X좌표 :" << x_ptr << endl;
        cout << "Y좌표 :" << y_ptr << endl;
      }
     
    int getX() const {
        return x_ptr;
    }
   
    int getY() const {
        return y_ptr;
    }
   
    void draw() const{
        cout << "점을 찍었습니다." << endl;
    }       
};

class Circle : public Point
{
public:
    Circle(int _x = 0, int _y = 0) : Point(_x, _y){
    }
   
    int getArea() const {
        return getX() * getY();
    }
   
    void draw() const{
        cout << "원을 그렸습니다." << endl;
    }        
};

class Cylinder : public Circle
{
    int height;
public:
    Cylinder(int _x = 0, int _y = 0, int _height=0) : Circle( _x , _y){
        height = _height;
    }
   
    int getVolume() const {
        return getArea() * height;
    }
   
    void draw() const{
        cout << "원기둥을 그렸습니다." << endl;
    }       
};

int main(){
    Point * pnt1 = new Cylinder(3, 5, 8);
    Point * pnt2 = new Circle(3, 4);
    Point * pnt3 = new Point(1,2);

    /*이부분은 에러*/
    /*추상클래스를 객체화시도*/
    Shape * shp = new Shape();
   
    pnt1->draw();
   
    system("pause");
    return 0;
}

- 컴파일 결과
사용자 삽입 이미지


'C++ > 다형성' 카테고리의 다른 글

연산자 오버로딩  (0) 2008.05.05
가상테이블(Virtual Table)  (0) 2008.05.05
Virtual 소멸자  (0) 2008.05.05

관련글 더보기