📝동적 바인딩
- 특징
- 컴파일 시점이 아닌 실행 중 기본 클래스의 포인터로 오버라이딩 한 파생 클래스의 함수를 실행
- 기본 클래스의 함수를 Virtual로 선언
#include <iostream>
#include <string>
using namespace std;
class Shape {
public:
void paint() {
draw();
}
virtual void draw() {
cout << "Shape::draw() called" << endl;
}
};
class Circle : public Shape {
public:
virtual void draw() {
cout << "Circle::draw() called" << endl;
}
};
int main() {
Shape* pShape = new Circle();
pShape->paint();
delete pShape;
}
📝 Virtual 함수의 오버라이딩
- 특징
- 함수이름, 매개변수 타입, 갯수 리턴타입이 모두 일치
- 파생클래스에서 virtual 생략 가능(상속됨)
📝 가상 소멸자
- 가상 소멸자
- 소멸자를 virtual 키워드로 선언
- 소멸자 호출 시 동적 바인딩 발생(파생 클래스의 소멸자 먼저 실행)
📝 순수 가상 함수
- 기본 클래스의 가상 함수 목적
- 파생 클래스에서 재정의할 함수를 알려주는 역할
- 기본 클래스의 가상 함수를 굳이 구현할 필요가 없음
- 순수 가상 함수
- pure virtual function
- 함수의 코드가 없고 선언만 있는 가상 멤버 함수
- 선언 방법
class Shape{
pubic:
virtual void draw() = 0;
}
📝 추상 클래스
- 특징
- 한 개 이상의 순수 가상 함수를 가진 클래스
- 순수 가상함수 때문에 객체 생성은 불가능 => 상속/설계를 위한 목적
- 포인터 선언은 가능 => 동적 바인딩을 위한 활용
- 추상 클래스의 상속
- 추상 클래스를 단순 상속하면 자동 추상 클래스
- 추상 클래스의 구현
- 추상 클래스를 상속받아 순수 가상 함수를 오버라이딩
#include <iostream>
using namespace std;
class Calculator {
void input() {
cout << "정수를 2개 입력하세요>>";
cin >> a >> b;
}
protected:
int a, b;
virtual int calc(int a, int b) = 0;
public:
void run() {
input();
cout << "계산된 값은" << calc(a, b) << endl;
}
};
class Adder :public Calculator {
protected:
int calc(int a, int b) {
return a + b;
}
};
class Sub :public Calculator {
protected:
int calc(int a, int b) {
return a - b;
}
};
int main() {
Adder add;
Sub sub;
add.run();
sub.run();
}