안녕하세요! 이번 글에서는 C++ 프로그래밍에서 가상 함수와 순수 가상 함수에 대해 자세히 설명하겠습니다. 또한, 실제로 어떤 상황에서 많이 사용되는지 예제를 통해 살펴보겠습니다. 이 내용은 다음 글에서 다룰 함수 오버라이딩에 대한 내용을 기반으로 합니다.
가상 함수 (Virtual Functions)
가상 함수는 기본 클래스에서 선언되고, 하위 클래스에서 재정의할 수 있는 멤버 함수입니다. 가상 함수는 다형성(polymorphism)을 구현하는 데 사용되며, 동적 바인딩(dynamic binding)에 의해 실행 시간에 어떤 함수가 호출될지 결정됩니다.
가상 함수를 선언하기 위해 해당 함수의 선언 앞에 virtual 키워드를 사용합니다. 하위 클래스에서 가상 함수를 재정의할 때는 override 키워드를 사용하여 명시적으로 표시할 수 있습니다.
다음은 가상 함수의 예제입니다
class Shape
{
public:
virtual void draw()
{
cout << "Drawing a shape." << endl;
}
};
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* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->draw();
shape2->draw();
delete shape1;
delete shape2;
return 0;
}
- Shape 클래스는 가상 함수 draw()를 선언하고 있습니다. Circle 클래스와 Rectangle 클래스는 각각 Shape 클래스를 상속받고, draw() 함수를 재정의합니다.
- main() 함수에서는 Shape 포인터를 사용하여 Circle 객체와 Rectangle 객체를 가리키도록 합니다. 이후 draw() 함수를 호출하면 실행 시간에 적절한 함수가 호출됩니다. 이것이 가상 함수의 동작 방식입니다.
가상 함수는 상속 관계에서 다형성을 구현하는 데 주로 사용되며, 코드의 유연성과 확장성을 높입니다.
순수 가상 함수 (Pure Virtual Functions)
순수 가상 함수는 기본 클래스에서 정의하지 않고, 하위 클래스에서 반드시 재정의해야 하는 함수입니다. 순수 가상 함수는 구현이 없는 가상 함수로, 선언 시 = 0을 붙여야 합니다.
순수 가상 함수는 다음과 같이 선언됩니다
virtual void function() = 0;
- 순수 가상 함수를 포함한 클래스를 추상 클래스(abstract class)라고도 부릅니다. 추상 클래스는 객체를 직접 생성할 수 없으며, 상속을 통해 하위 클래스에서만 사용됩니다.
다음은 순수 가상 함수의 예제입니다
class Animal {
public:
virtual void makeSound() = 0;
};
class Cat : public Animal {
public:
void makeSound() override {
cout << "Meow!" << endl;
}
};
class Dog : public Animal {
public:
void makeSound() override {
cout << "Woof!" << endl;
}
};
int main() {
Animal* cat = new Cat();
Animal* dog = new Dog();
cat->makeSound();
dog->makeSound();
delete cat;
delete dog;
return 0;
}
- Animal 클래스는 순수 가상 함수 makeSound()를 선언하고 있습니다. Cat 클래스와 Dog 클래스는 Animal 클래스를 상속받고, makeSound() 함수를 재정의합니다.
- main() 함수에서 Animal 포인터를 사용하여 Cat 객체와 Dog 객체를 가리키도록 합니다. makeSound() 함수를 호출하면 실행 시간에 적절한 함수가 호출됩니다. 이를 통해 다양한 동물의 소리를 출력할 수 있습니다.
순수 가상 함수를 사용하여 추상 클래스를 정의하면 인터페이스를 제공하고 하위 클래스에서 특정 동작을 구현하도록 할 수 있습니다.
이번 글에서는 가상 함수와 순수 가상 함수에 대해 자세히 알아보았습니다.
다음 글에서는 함수 오버라이딩에 대한 내용을 다루겠습니다.
C++ 프로그래밍에 대한 지식을 확장해 나가는 데 도움이 되길 바랍니다.
감사합니다!
'[C++] > 프로그래밍 기초' 카테고리의 다른 글
[C++] 프로그래밍 기초 : 연산자 오버로딩 (0) | 2023.06.03 |
---|---|
[C++] 프로그래밍 기초 : 함수 오버라이딩 (0) | 2023.06.03 |
[C++] 프로그래밍 기초 : 클래스의 상속과 정보은닉 (0) | 2023.06.02 |
[C++] 프로그래밍 기초 : 클래스 (0) | 2023.06.02 |
[C++] 프로그래밍 기초 : 포인터와 참조자 (0) | 2023.06.02 |