CS/ETC

순수 가상함수, 일반 가상함수

혀니리리 2023. 12. 19. 14:08
728x90

[C++] 가상함수와 순수가상함수의 차이(virtual, pure virtual)에 대해서 (tistory.com)

 

[C++] 가상함수와 순수가상함수의 차이(virtual, pure virtual)에 대해서

안녕하세요. BlockDMask 입니다. 오늘은 C++의 아주 중요한 가상함수, 순수가상함수에 대해서 알아보겠습니다. 우선, 기본적으로 가상함수(virtual)와 순수가상함수(pure virtual)에 대한 기본적인 지식이

blockdmask.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