-클래스 내에서 virtual function을 선언할 때는 앞에 virtual 키워드를 붙인다.그러나 정의할 때에는 virtual 키워드를 붙이지 않는다. 정의를 하고 싶지 않다면 예를 들어 virtual void draw( ) = 0; 처럼 , 끝에 = 0 를 붙이면 된다. 만약 붙이지 않는다면 virtual function이라도 정의를 반드시 해야한다.
- 컴파일 시 호출할 함수가 정해지는 방식이 아니다. 호출할 함수는 실행시에 호출한 객체의 타입에 기반해서 호출 된다.
따라서 기반클래스 타입의 포인터변수가 실제로는 동적할당된 파생클래스의 객체를 담고 있을 때, 파생클래스의 정의에 기반한 함수 호출이 이루어지기 위해서는 이 함수가 virtual 여야 한다.
(부연설명)기반클래스 타입의 포인터변수가 실제로는 동적할당된 파생클래스의 객체를 담고 있을 때의 (예)
Base* pBase = new Derived; //만약 정적변수를 가리키면 pBase를 통한 호출은 모두 Base에서 정의된 함수를 따른다. pBase->SomeFuncOfBase(); // SomeFuncOfBase가 virtual 이 아니면 여기서 기반클래스의 정의의 따른 호출을 한다. delete pBase; // 기반 클래스 소멸자가 virtual이 아니면 여기서는 기반클래스의 소멸자가 호출된다.
-재정의로 해결될 문제가 아닌 예를 확실히 하라. (Savitch, Absolute C++ chapter 15 초반)
상속 받을 함수가 내부에서 어떤 함수를 호출하는데, 바로 그 함수가 재정의되어야할 필요가 있을 때,
단지 그 (내부에서 호출될) 함수만 재정의 한다면,정작 상속받을 함수에서 동작하는 내용은 달라지지 못한다. 이런 경우 상속된 클래스를 사용할 때 문제가 생긴다.
'Application-level프로그래밍' 카테고리의 다른 글
헝가리안 표기법 (0) | 2009.09.16 |
---|---|
(C++) Template 요약 (0) | 2009.09.13 |
(C++) Inheritance(상속) 요약 (0) | 2009.09.13 |
(C++) Operator overloading 요약 (0) | 2009.09.13 |
(C++) 클래스의 멤버변수를 레퍼런스 타입으로 갖으려면 (0) | 2009.09.13 |