✔정적 바인딩
프로그램 컴파일 시점에 함수 호출이 결정되는 바인딩으로 일반 함수에 해당(non-virtual)
빠르고 메모리 사용이 적음
✔동적 바인딩
프로그램 실행 시점에 함수 호출이 결정되는 바인딩으로 가상 함수(virtual function_virtual 키워드) 사용
실행 중에 객체의 실제 타입에 따라 적합한 함수 호출
//파생 클래스에서 기본 클래스의 함수를 재정의했더라도,
//포인터나 참조가 기본 클래스 형식인 경우 기본 클래스의 함수가 호출
#include <iostream>
using namespace std;
class Base {
public:
virtual void Print() { // 동적 바인딩
cout << "Base Print" << endl;
}
void NonVirtualPrint() { // 정적 바인딩
cout << "Base NonVirtualPrint" << endl;
}
};
class Derived : public Base {
public:
void Print() override { // 동적 바인딩
cout << "Derived Print" << endl;
}
void NonVirtualPrint() { // 정적 바인딩
cout << "Derived NonVirtualPrint" << endl;
}
};
int main() {
Base* basePtr = new Derived();
// 동적 바인딩 (virtual)
basePtr->Print(); // Derived Print
// 정적 바인딩 (non-virtual)
basePtr->NonVirtualPrint(); // Base NonVirtualPrint
delete basePtr;
return 0;
}
💡Plus
- 가상함수는 가상 함수 테이블이라는 구조를 사용하여 호출 대상이 실행 시점에 결정됨
- 가상 함수가 있는 클래스에서 소멸자는 반드시 virtual로 선언해야 메모리 누수 방지 가능
#include <iostream>
using namespace std;
class Base {
public:
virtual void Print() { // 가상 함수
cout << "Base Print" << endl;
}
virtual ~Base() {} // 가상 소멸자
};
'C++' 카테고리의 다른 글
매개변수 전달 시 *와 & (0) | 2025.02.09 |
---|---|
const (0) | 2025.02.09 |
자료형의 오버플로우 (0) | 2025.02.09 |
입력 예외 처리 (0) | 2025.02.09 |
Vector (0) | 2025.02.09 |