추상 클래스란 뭘까? 특징은 다음과 같다.
말 그대로 추상클래스는 인스턴스화가 불가능하다. 그렇다면 어떤 걸 보고 추상클래스인지 아닌지 알 수 있을까? 추상클래스는 순수 가상 함수를 갖고 있다. 멤버 함수 앞과 뒤에 virtual
과 = 0
가 있다면 순수 가상 함수이다.
virtual void attack(std::string const &target) = 0;
class ACharacter {
public:
virtual void attack(std::string const &target) = 0;
void sayHello(std::string const &target);
};
class Warrior : public ACharacter {
public:
virtual void attack(std::string const &target);
};
void ACharacter::sayHello(std::string const &target) {
std::cout << "Hello" << target << " !" << std::endl;
}
void Warrior::attack(std::string const &target) {
std::cout << "attacks " << target << " with a sword" << std::endl;
}
int main() {
ACharacter* a = new ACharacter();
a->sayHello("students");
a->attack("roger");
}
다음과 같이 순수 가상 함수를 자식에서 오버라이딩하지 않으면 컴파일 되지 않는다.
#include <string>
#include <iostream>
class ACharacter {
public:
virtual void attack(std::string const &target) = 0;
void sayHello(std::string const &target);
};
class Warrior : public ACharacter {
public:
};
void ACharacter::sayHello(std::string const &target) {
std::cout << "Hello" << target << " !" << std::endl;
}
int main() {
ACharacter* a = new Warrior();
a->sayHello("students");
}
인터페이스는 순수 가상 함수로만 이루어진 클래스를 의미한다.
class ICoffeeMaker {
public:
virtual void fillWaterTank(IWaterSource *src) = 0;
virtual ICoffee* makeCoffee(IWaterSource *src) = 0;
};
만약 ACharacter 를 인터페이스로 만들고 싶다면, sayHello 함수를 없애면 된다.
class ACharacter {
public:
virtual void attack(std::string const &target) = 0;
};
ACharacter
ICoffeeMaker
#define interface ~~~
를 이용해보자 C++언어에서는 구조체는 디폴트 가시성이 public이어서 구조체를 이용하여 인터페이스를 정의하기도 한다.#define interface struct
interface IPlay //구조체는 디폴트 가시성
{
virtual void Play()=0;
};
물론 class를 이용하여 인터페이스를 만들 수도 있다.#define interface class
interface IPlay
{
public:
virtual void Play()=0;
};