가상함수 4

C++ 가상 함수 (virtual) - 가상 함수의 원리

가상함수의 원리가상 함수는 실행 시간에 호출될 함수를 결정합니다.- 그럼 어떻게 실행 시간에 객체의 클래스형에 따라 재정의된 가상 함수를 찾아 호출할 수 있는 것일까요? C++는 가상 함수를 처리하기 위해 가상 함수를 갖는 클래스마다 가상 함수 테이블을 생성합니다.- 또한, 가상 함수를 갖는 클래스의 객체마다 가상 함수 테이블 포인터라는 숨겨진 멤버 변수를 생성합니다.- C++ 컴파일러가 가상 함수를 갖는 클래스에 대해 가상 함수 테이블을 생성하고 가상 함수 테이블을 갖는 클래스의 객체를 생성하면 객체의 멤버 변수를 할당하기 전에 먼저 가상 함수 테이블의 주소를 저장하는 가상 함수 테이블 포인터가 할당됩니다.- 바로 이 가상 함수 테이블 포인터와 가상 함수 테이블이 가상 함수를 호출할 때 이용되는 것입니다.

C++ 가상 함수 (virtual) - 가상 소멸자

가상 소멸자클래스에 가상 함수를 정의할 때 주의할 점은 소멸자도 가상함수로 만들어야 한다는 점입니다.동적으로 생성한 파생 클래스 객체를 기본 클래스 포인터로 가리키고 있을 때 동적으로 생성한 객체를 해제하려면 기본 클래스 포인터로부터 delete 해야 합니다.  delete pShape;는 pShape가 Shape 포인터이므로 Shape 클래스의 소멸자를 호출합니다.- delete pShape;는 항상 기본 클래스인 Shape 클래스의 소멸자만 호출됩니다.- pShape가 실제로는 Rectangle 클래스 객체의 주소를 저장하므로 pShape로 delete할 때 Rectangle의 소멸자가 호출되어야 합니다.- 이를 위해 Shape 클래스의 소멸자를 가상함수로 선언하면 됩니다.동적으로 생성한 파생 클래스..

C++ 가상 함수 (virtual) - 동적 바인딩

동적 바인딩기본 클래스의 포인터나 레퍼런스로 가상 함수를 호출하면 기본 클래스의 포인터나 레퍼런스가 어떤 클래스의 객체를 가리키는가에 따라 호출될 함수가 결정됩니다,- 실행 시간에 호출될 함수를 결정하는 것을 동적 바인딩(Dynamic Binding)이라고 합니다.- 반면, 컴파일 시간에 호출될 함수를 미리 결정하는 것을 정적 바인딩(Static Binding)이라고 합니다.  특징정적 바인딩동적 바인딩바인딩 시기컴파일 시간실행 시간구분일반 함수가상 함수장점동적 바인딩에 비해 처리속도가 빠르다프로그램의 융통성이 크다단점프로그램의 융통성이 작다정적 바인딩에 비해 처리속도가 늦다 가상함수를 제외한 모든 함수는 정적 바인딩으로 처리됩니다.- 정적 바인딩은 컴파일 시간에 호출될 함수를 미리 정해두는 방법입니다...

C++ 가상 함수 (virtual) - 기본

가상 함수 (Virtual)기본 클래스의 포인터로 호출하더라도 파생 클래스에 재정의된 함수를 호출하도록 만들려면 기본 클래스의 멤버 함수를 가상 함수로 선언해야 한다.- 기본 클래스를 상속받은 파생 클래스에 같은 함수가 있다면 파생 클래스의 함수는 무시되고 기본 클래스의 함수로 실행이 됩니다.- 파생 클래스의 함수를 실행시키고 싶다면 virtual 키워드를 사용해야 합니다. 이전에 상속에서 예를 들었었던 Shape를 예로 들어 이어나가겠습니다.   Shape 클래스 선언부- void Draw() const; 함수에 가상함수 키워드가 없는 이전의 예제입니다. 가상함수 키워드를 사용하지 않고 Draw 함수를 호출하게 되면 아래와 같은 결과가 나옵니다.  파생 클래스(Rectangle, Eclipse)의 Dr..