728x90
[C++] 가상함수와 순수가상함수의 차이(virtual, pure virtual)에 대해서 (tistory.com)
순수가상함수는 자식에게 '아들아 너는 A기능이 꼭 있어야해! 근데 그것은 너가 알아서 선언해!, 이거 선언안하면 아들아 너의 클래스는 돌아가지 않는단다.' (순수하다 진짜.)
일반(단순)가상함수는 '아들아 B기능을 물려줄건데, 니가 선언안해도 내가 기본적으로 기능이 돌아가게 해줄게' 이런것입니다.
#include <iostream>
using namespace std;
class Car
{
public:
virtual void Drive()
{
//앞으로 간다.
cout << "Drive()" <<endl;
return;
}
virtual void Stop()
{
//멈춘다.
cout << "Stop()" <<endl;
return;
}
virtual void Back()
{
//후진한다.
cout << "Back()" <<endl;
return;
} // 일반 가상함수
//자동차는 문이 열리고 닫혀야 하지만 문이 위로 열리는지 옆으로 열리는지 모르니
//상속받아서 해당 클래스에 맞게 선언, 구현해라.
//근데, 이 기능이 없으면 자동차가 아니다.
virtual void OpenDoor() = 0;
virtual void CloseDoor() = 0; //순수 가상함수
}
=> 문이 옆으로 열릴지 위로 열릴지 모르니 OpenDoor(), CloseDoor()은 순수 가상함수로 구현하여 따로 구현하지 않으면 실행이 안되도록 하고, 나머지는 기능이 동일하니 일반 가상함수로 구현한다.
class SuperCar : public Car
{
public:
virtual void OpenDoor() override
{
//위로 열린다.
cout <<"super - open()" <<endl;
return;
}
virtual void CloseDoor() override
{
//아래로 닫힌다.
cout <<"super - close()" << endl;
return;
}
}
class NormalCar : public Car
{
public:
virtual void OpenDoor() override
{
//위로 열린다.
cout <<"normal - open()" <<endl;
return;
}
virtual void CloseDoor() override
{
//아래로 닫힌다.
cout <<"normal - close()" << endl;
return;
}
}
<Main함수에서 사용 예시>
int main(void)
{
cout <<"1 슈퍼카 클래스의 Drive와 OpenDoor" <<endl;
SuperCar* pSuper = new SuperCar;
pSuper->Drive();
pSuper->OpenDoor();
cout <<"2 일반카 클래스의 Drive와 OpenDoor" <<endl;
NormalCar* pNormal = new NormalCar;
pNormal->Drive();
pNormal->OpenDoor();
cout <<"3 Car 부모 클래스의 포인터로 자식들의 객체를 가리킨다." <<endl;
Car* pCar = nullptr;
pCar = dynamic_cast<Car*>(pSuper);
pCar->Drive();
pCar->OpenDoor();
pCar = dynamic_cast<Car*>(pNormal);
pCar->Drive();
pCar->OpenDoor();
system("pause");
pCar = nullptr;
delete pSuper;
delete pNormal;
return 0;
}
어떤 것을 어떤 가상함수로 구현해야하는지 정해진 것은 없지만, 보통은 기능이 다르게 구현되어야 하는것을 순수 가상함수로 구현하여 꼭 구현하고 넘어가도록 함
728x90
'CS > ETC' 카테고리의 다른 글
C# C++ 속도차이와 그 이유 (0) | 2024.01.09 |
---|---|
FSM(Finite-state machine) (0) | 2023.12.19 |
OOP(Object-oriented programming) (0) | 2023.12.19 |
Call by Value Vs Call by Reference (0) | 2023.10.01 |
C++과 C#의 차이 (+ 속도차이) (0) | 2023.09.27 |