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
'Programming Language > C,C++' 카테고리의 다른 글
C, C++] 헤더파일과, CPP파일로 소스 코드 분리 (29) | 2017.07.04 |
---|---|
C++] 상속 관계에서의 오버로딩(함수 중복) (0) | 2017.07.02 |
C++] 일반화와 템플릿 (0) | 2017.06.28 |
C++] 추상 클래스 (0) | 2017.06.26 |
C++] 참조에 의한 호출로 객체 전달 (0) | 2017.06.21 |