virtual
키워드로 선언오버라이딩 시 virtual 지시어 생략 가능
private, protected, public 중 자유롭게 지정 가능
기본클래스::가상함수()
형태로 기본 클래스의 가상 함수를 정적 바인딩으로 호출
class Shape {
public:
virtual void draw() {
...
}
};
class Circle : public Shape {
public:
virtual void draw() {
Shape::draw(); // 기본 클래스의 draw()를 실행한다.
.... // 기능을 추가한다.
}
};
virtual
키워드로 선언멤버 함수의 원형=0;
class Shape {
public:
virtual void draw()=0; // 순수 가상 함수 선언
};
최소한 하나의 순수 가상 함수를 가진 클래스
class Shape { // Shape은 추상 클래스
Shape *next;
public:
void paint() {
draw();
}
virtual void draw() = 0; // 순수 가상 함수
};
void Shape::paint() {
draw(); // 순수 가상 함수라도 호출은 할 수 있다.
}
Shape shape; // 컴파일 오류
Shape *p = new Shape(); // 컴파일 오류
Shape *p;
목적 : 상속에서 기본 클래스의 역할을 하기 위함
class Shape {
public:
virtual void draw() = 0;
};
class Circle : public Shape {
public:
virtual void draw() {
cout << "Circle";
}
string toString() { return "Circle 객체"; }
};
Shape shape; // 객체 생성 오류
Circle waffle; // 정상적인 객체 생성