가상 함수 (Virtual Function)
가상 함수는 기본 클래스에서 선언되고 파생 클래스에서 재정의될 수 있는 함수입니다. 가상 함수는 다형성을 구현하는 데 사용됩니다.
1. 가상 함수 선언
가상 함수는 기본 클래스에서 virtual
키워드를 사용하여 선언합니다.
class Base {
public:
virtual void show() {
cout << "Base class show function" << endl;
}
};
class Derived : public Base {
public:
void show() override {
cout << "Derived class show function" << endl;
}
};
int main() {
Base* basePtr;
Derived derivedObj;
basePtr = &derivedObj;
basePtr->show(); // Derived class show function
return 0;
}
추상 클래스 (Abstract Class)
추상 클래스는 하나 이상의 순수 가상 함수를 포함하는 클래스입니다. 추상 클래스는 직접 인스턴스화할 수 없으며, 이를 상속받는 파생 클래스에서 순수 가상 함수를 반드시 재정의해야 합니다.
1. 순수 가상 함수
순수 가상 함수는 = 0
으로 정의된 가상 함수입니다.
class AbstractBase {
public:
virtual void pureVirtualFunction() = 0; // 순수 가상 함수
};
class Derived : public AbstractBase {
public:
void pureVirtualFunction() override {
cout << "Derived class implementation of pure virtual function" << endl;
}
};
int main() {
// AbstractBase obj; // 오류: 추상 클래스는 인스턴스화할 수 없음
Derived obj;
obj.pureVirtualFunction(); // Derived class implementation of pure virtual function
return 0;
}
예제 문제
문제 1: 동물 클래스와 이를 상속받는 고양이와 개 클래스 작성 (추상 클래스 사용)
동물 클래스를 작성하고, 이를 상속받는 고양이와 개 클래스를 작성하세요. 동물 클래스는 추상 클래스여야 하며, 각 클래스는 동물이 소리를 내는 순수 가상 함수를 재정의해야 합니다.
해설:
#include <iostream>
using namespace std;
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 << "Bark" << endl;
}
};
int main() {
Animal* animal1 = new Cat();
Animal* animal2 = new Dog();
animal1->makeSound(); // Meow
animal2->makeSound(); // Bark
delete animal1;
delete animal2;
return 0;
}
이 프로그램은 동물 클래스를 추상 클래스로 만들고, 이를 상속받는 고양이와 개 클래스에서 순수 가상 함수를 재정의합니다.
문제 2: 도형 클래스와 이를 상속받는 원과 사각형 클래스 작성 (추상 클래스 사용)
도형 클래스를 작성하고, 이를 상속받는 원과 사각형 클래스를 작성하세요. 도형 클래스는 추상 클래스여야 하며, 각 클래스는 도형의 면적을 계산하는 순수 가상 함수를 재정의해야 합니다.
해설:
#include <iostream>
#include <cmath>
using namespace std;
class Shape {
public:
virtual double area() = 0; // 순수 가상 함수
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() override {
return M_PI * radius * radius;
}
};
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() override {
return width * height;
}
};
int main() {
Shape* shape1 = new Circle(5.0);
Shape* shape2 = new Rectangle(4.0, 6.0);
cout << "Circle area: " << shape1->area() << endl; // Circle area: 78.5398
cout << "Rectangle area: " << shape2->area() << endl; // Rectangle area: 24
delete shape1;
delete shape2;
return 0;
}
이 프로그램은 도형 클래스를 추상 클래스로 만들고, 이를 상속받는 원과 사각형 클래스에서 순수 가상 함수를 재정의합니다.
문제 3: 차량 클래스와 이를 상속받는 자전거와 자동차 클래스 작성 (추상 클래스 사용)
차량 클래스를 작성하고, 이를 상속받는 자전거와 자동차 클래스를 작성하세요. 차량 클래스는 추상 클래스여야 하며, 각 클래스는 차량의 최고 속도를 반환하는 순수 가상 함수를 재정의해야 합니다.
해설:
#include <iostream>
using namespace std;
class Vehicle {
public:
virtual int topSpeed() = 0; // 순수 가상 함수
};
class Bicycle : public Vehicle {
public:
int topSpeed() override {
return 25; // 자전거의 최고 속도
}
};
class Car : public Vehicle {
public:
int topSpeed() override {
return 200; // 자동차의 최고 속도
}
};
int main() {
Vehicle* vehicle1 = new Bicycle();
Vehicle* vehicle2 = new Car();
cout << "Bicycle top speed: " << vehicle1->topSpeed() << " km/h" << endl; // Bicycle top speed: 25 km/h
cout << "Car top speed: " << vehicle2->topSpeed() << " km/h" << endl; // Car top speed: 200 km/h
delete vehicle1;
delete vehicle2;
return 0;
}
이 프로그램은 차량 클래스를 추상 클래스로 만들고, 이를 상속받는 자전거와 자동차 클래스에서 순수 가상 함수를 재정의합니다.
다음 단계
16일차의 목표는 C++의 가상 함수와 추상 클래스에 대해 학습하는 것이었습니다. 다음 날부터는 템플릿 기초에 대해 다룰 것입니다.
내일은 "템플릿 기초"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!
'-----ETC----- > C++ 마스터 시리즈' 카테고리의 다른 글
[C++ 마스터] Day 18: 예외 처리 (0) | 2024.08.01 |
---|---|
[C++ 마스터] Day 19: 표준 템플릿 라이브러리 (STL) 소개 (0) | 2024.08.01 |
[C++ 마스터] Day 17: 템플릿 기초 (0) | 2024.08.01 |
[C++ 마스터] Day 15: 상속과 다형성 (0) | 2024.08.01 |
[C++ 마스터] Day 13: 생성자와 소멸자 (0) | 2024.08.01 |