본문 바로가기

Language/C++

virtual 함수

virtual 함수

virtual 함수란 말그대로 가상의 함수이다. 가상이란 실제로 없는데 있는척 훼이크 쓰는거다.
virtual 함수는 함수 오버라이딩이 반드시 있어야 하는데 간단하게 오버라이딩을 해보면..

#include <iostream.h>

class AAA
{
public:
    void a()
    {
        cout<<"AAA"<<endl;
    }
};

class BBB:public AAA
{
public:
    void fct()
    {
        cout<<"BBB"<<endl;
    }
};

int main(void)
{
    BBB* b = new BBB;
    b.fct();

    AAA* a = b;
    a->a();//b클래스를 가리키고 있지만 AAA클래스의 포인터 변수이기 때문에 객체 포인터 특성상 AAA클래스의 객체는
            //BBB 객체를 가리키고 있어도 AAA클래스의 멤버함수만 호출이 가능하다.!
    delete b;

    return 0;
}

여기서 AAA의 클래스에 있는 a()함수가 호출이 되고 있는데 내가 원한건 BBB클래스의 함수인데...AAA클래스가 되면 ..ㅡㅡ
이때 AAA클래스의 void a() 함수 해더 부분에 virtual 의 키워드를 붙여준다.

virtual void a()//함수를 없는걸로 하고 상속된 클래스에 오버라이딩 된 함수가 호출된다.

이렇게 코드가 작성이 되면 호출은 AAA클래스의 a()함수를 호출하러 제어가 이동하지만 virtual 이라는 키워드 때문에 진짜! 함수가
아닌 가상 함수로 인식을 하고 BBB클래스의 a() 함수로 가서 실행을 하게 된다. 바로 이것을 '함수의 재정의' 라고 한다.

이 virtual 키워드는 최 상위 Base class만 붙여주면 그 뒤로 줄줄이 상속을 받은후 오버라이딩을 했다고 해도 굳이 기제를 할 필요가
없이 묵시적으로 virtual 함수로 호출이 된다. 여기서 BBB클래스의 a() 함수도 엄연히 말하자면 virtual 함수이다. 하지만 그 후로 오버라이딩이
된 클래스가 없으므로 BBB클래스의 함수가 호출되는 것이다. 이러한 작용을 하는이유는 virtual 이라는 키워드 까지도 상속이 되어버리기 때문!