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;
}
- 컴파일 결과