Programming Language/C,C++

C++] 가상함수 호출과 오버라이딩

TwinParadox 2017. 7. 1. 12:00
728x90




#include <iostream>
using namespace std;
 
class Base
{
public:
    virtual void f()
    {
        cout << "Base::f() Called" << endl;
    }
};
class Derived : public Base
{
public:
    virtual void f()
    {
        cout << "Derived::f() Called" << endl;
    }
};
void main()
{
    Derived d, *pDer;
    pDer = &d;
    pDer->f();
 
    Base* pBase;
    pBase = pDer;
    pBase->f();
}





pDer->f()로 Derived::f()를 호출


pBase가 Base 타입의 포인터로 Base::f()를 호출할 것으로 판단할 수도 있지만,

pBase가 가리키는 객체가 오버라이딩한 Derived::f()를 포함해 동적 바인딩이 발생

결과적으로 Derived::f()가 호출한다.

-> Base의 f()에 대한 모든 호출이 실행 시간 중에는 Derived의 f() 함수로 동적 바인딩.




가상함수(Virtual Function)

virtual 키워드로 선언된 경우, 컴파일러에게 자신에 대한 호출 바인딩을 실행 시간까지 미루도록 지시

어느 클래스에서든 선언 가능함.



함수 오버라이딩(Function Overriding, 혹은 중복 )

파생 클래스에서 기본 클래스의 가상 함수와 완전히 동일한 원형의 함수를 재정의

C++의 다형성 중 하나

기본 클래스의 포인터, 파생 클래스의 포인터를 이용하더라도 가상함수를 호출하면

파생 클래스에 오버라이딩된 함수가 항상 실행됨

728x90