반응형
순수 가상 함수(Pure Virtual Function)는 객체 지향 프로그래밍에서 인터페이스와 유사한 개념을 구현할 때 사용됩니다. 순수 가상 함수는 함수의 선언만 있고, 정의가 없는 함수입니다. **파생 클래스에서 반드시 재정의(override)**해야 하며, 이를 통해 다형성을 구현하는데 도움을 줍니다. 순수 가상 함수를 포함한 클래스를 추상 클래스라고 부르며, 추상 클래스의 인스턴스를 직접 생성할 수 없습니다.
순수 가상 함수의 선언
순수 가상 함수는 함수 선언 끝에 = 0을 추가하여 정의됩니다.
virtual void 함수이름() = 0;
예제 코드
아래 예제에서 Shape는 순수 가상 함수를 포함하는 추상 클래스이고, 이를 상속받는 Circle과 Rectangle 클래스에서 순수 가상 함수 draw를 구현합니다.
#include <iostream>
using namespace std;
// 추상 클래스
class Shape {
public:
virtual void draw() = 0; // 순수 가상 함수
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing a Circle" << endl;
}
};
class Rectangle : public Shape {
public:
void draw() override {
cout << "Drawing a Rectangle" << endl;
}
};
int main() {
// Shape* shape = new Shape(); // 추상 클래스는 인스턴스화할 수 없음
Shape* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->draw(); // Circle의 draw() 호출
shape2->draw(); // Rectangle의 draw() 호출
delete shape1;
delete shape2;
return 0;
}
(Output)
Drawing a Circle
Drawing a Rectangle
설명
- Shape 클래스: draw라는 순수 가상 함수를 선언하여 추상 클래스로 만듭니다. 추상 클래스는 직접 인스턴스화할 수 없으므로 Shape 타입의 객체를 생성하려 하면 컴파일 오류가 발생합니다.
- Circle과 Rectangle 클래스: Shape 클래스를 상속받고 draw 함수를 재정의합니다. 각각의 클래스에서 서로 다른 형태로 draw 함수를 구현하여, 다양한 도형을 그릴 수 있게 합니다.
- 다형성: Shape* 타입의 포인터 shape1과 shape2가 각각 Circle과 Rectangle 객체를 가리키며, shape1->draw()는 Circle 클래스의 draw 함수, shape2->draw()는 Rectangle 클래스의 draw 함수가 호출됩니다.
이 예제는 추상 클래스와 순수 가상 함수를 사용하여 구체적인 구현을 강제하고, 다형성을 통해 다양한 형태의 객체를 다룰 수 있게 하는 방법을 보여줍니다.
반응형
'C_C++' 카테고리의 다른 글
C++, 멤버함수로 연산자 오버로딩 (0) | 2024.11.13 |
---|---|
C++, typeid() 클래스 이름 알아내기 (0) | 2024.11.12 |
C++, 가상 함수의 특징 Features of Virtual Functions (0) | 2024.11.10 |
c++, 정적 멤버 변수와 정적 함수 static member variables and static functions (0) | 2024.11.02 |
C++, 생성자 오버로딩 개요 Constructor Overloading Overview (0) | 2024.10.25 |