728x90
반응형
1. 추상 클래스 (abstract class)
class Shape {
public:
virtual void Draw() = 0;
};
class Rect : public Shape {
public:
virtual void Draw() { } // 구현
};
int main() {
Shape s; // error
Shape* p; // ok
Rect r; // 구현부가 있으므로 ok
}
① 순수 가상 함수 (pure virtual function)
=> 함수의 구현부가 없고, 선언부가 =0 으로 끝나는 가상함수
② 추상 클래스 (Abstract Class)
=> 순수 가상 함수가 한 개 이상 있는 클래스
③ 추상 클래스 특징
=> 객체를 생성할 수 없다.
=> 포인터 변수는 만들 수 있다.
④ 추상 클래스로부터 파생된 클래스
=> 기반 클래스의 순수 가상함수의 구현부를 제공하지 않으면 역시 추상 클래스이다.
⑤ 추상 클래스의 설계 의도
=> 파생 클래스에게 특정 멤버 함수를 반드시 만들어야 한다고 지시하는 것
2. 추상 클래스 예제
#include <iostream>
#include <vector>
using namespace std;
class Shape {
public:
virtual void Draw() { cout << "Shape::Draw" << endl; }
};
class Rect : public Shape {
public:
virtual void Draw90 { cout << "Rect::Draw" << endl; }
};
class Circle : public Shape {
public:
virtual void Draw() { cout << "Circle::Draw" << endl; }
};
int main() {
vector<Shape*> v;
while (1) {
int cmd;
cin >> cmd;
if ( cmd == 1 ) v.push_back( new Rect );
else if ( cmd == 2 ) v.push_back( new Circle );
else if (cmd == 9 ) {
for ( auto p : v ) // p 는 Shape* 타입
p->Draw();
}
}
}
① 모든 도형을 타입으로 설계한다.
=> Rect, Circle 클래스 설계
② 모든 도형의 공통의 기반 클래스가 있다면 모든 도형을 하나의 컨테이너에 묶어서 관리 할 수 있다.
=> Shape 클래스 도입
=> vector<Shape*>에 모든 도형 보관
③ 모든 도형의 공통의 특징(Draw 함수)는 반드시 Shape에 있어야 한다.
=> Shape*를 사용해서 Draw를 호출할 수 있어야 한다.
위는 도형 그리기 프로그램을 예제로 만든 것이다.
위에서 Shape를 기반 클래스로 필요한 도형을 모두 만들어 Draw를 선언하고 있다.
그런데 위에서 기반클래스인 Shape는 "도형"이라는 추상적인 존재이므로 그릴 수 없다.
그래서 다시 만든다면
class Shape {
public:
virtual void Draw() {}
};
위와 같은 형태로 만든다면 그릴 수 없는 (그리지 않는) 상태가 된다.
하지만 문제가 있다.
누군가 Triangle이라는 클래스를 새로 만드는데 실수로 Draw를 만들지 않았다고 해보자.
class Triangle : public Shape {
};
위와 같은 형태가 될텐데 위의 코드는 컴파일 시 아무문제가 없다.
따라서 동작에 문제가 될 수 있기에 이럴 때 Shape의 Draw를 순수 가상함수로 만들어
Shape를 기반으로 하는 파생클래스는 모두 Draw를 만들어야만 하게 한다.
class Shape {
public:
virtual void Draw() = 0;
};
④ Draw를 순수 가상함수로 제공하면
=> 모든 도형의 설계자는 반드시 Draw 함수의 구현부를 제공해야 한다.
이렇게 되면 훨씬 안전하고 일관성이 있는 프로그램을 만들 수 있다.
728x90
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] RTTI (Run Time Type Information) (0) | 2019.12.02 |
---|---|
[C++] 인터페이스 (interface) (0) | 2019.12.01 |
[C++] 가상 소멸자 (0) | 2019.11.30 |
[C++] 가상 함수 문법 정리 (0) | 2019.11.28 |
[C++] 가상 함수 (virtual function) (2) | 2019.11.26 |