: virtual 함수인데, 구현부가 없고,
1. 선언부가 = 0으로 끝나는 함수를 말함.
2. 또는 선언만 하고 뒤에다가 abstract 키워드를 붙이는 경우.
: 순수 가상함수가 한개 이상 있는 클래스
: 기반 클래스의 순수가상함수의 구현부 제공하지 않으면, 역시 추상 클래스로
받아들이므로,
-> 파생클래스도 불완전한 형태임.
: 파생 클래스에게 특정 멤버 함수를 반드시 만들어야 함을 명시함.
: Shape 추상 클래스를 만들고, Rect, Triangle 파생클래스로 상속받아서,
Draw 함수 호출까지 해서 Rect와 Triangle를 그리자.
: 추상클래스를 인터페이스라고도 함.
가) 인터페이스 개념 사용하지 않을 때의 코드
나) 인터페이스 개념 사용할 때의 코드
people p;
Camera c;
p.useCam(&c1); // useCam 은 함수에서 cl->take()를 호출함.
그러면 hdCam의 take를 호출하기 위한 함수를 또 만들 것인가???
-> 변경되는 코드는 열려있게 만들자.
인터페이스화 하자.
1) take 함수를 인터페이스 클래스로 만들자.
2) 새롭게 추가되는 기능들은 상속 받아서 사용
3) people 클래스에서는 인자를 인터페이스로 받아야 함.
problem
: 위의 내용을 토대로 코드를 구현하라.
: 파생 클래스에게 특정 멤버 함수를 반드시 만들어야 함을 명시함.
class ICamera
{
public:
virtual void take() const = 0;
};
class Peaple
{
public :
void useCamera(const ICamera& obj)
{
obj.take();
}
};
class Camera : public ICamera
{
public :
virtual void take() const override
{
cout << "camera" << endl;
}
};
class HDCamera : public ICamera
{
public :
virtual void take() const override {
cout << "HDCamera" << endl;
}
};
int main()
{
Peaple p;
Camera cc;
p.useCamera(cc);
HDCamera hdC;
p.useCamera(hdC);
}