오늘의 주제는 생성자 혹은 소멸자 안에서 가상 함수를 호출하지 말자! 이다.
파생클래스안의 생성자 소멸자에서 라는 중요한 문장이 빠져있다. 기본클래스나 파생클래스에서 실제로 생성자 혹은 소멸자 안에서 가상함수를 호출하게되면 컴파일에러가 난다. ( 비주얼스튜디오 컴파일러는 그렇다.)
왜나하면 파생클래스 객체의 기본 클래스 부분이 생성되는 동안은, 그 객체의 타입은 바로 기본클래스라는 점이다. 따라서 호출되는 가상 함수는 모두 기본 클래스의 것으로 결정(resolve)될 뿐만 아니라 런타임 타입 정보를 사용하는 언어 요소(dynamic_cast, typeid)를 사용한다 해도 이 순간엔 모두 기본 클래스 타입의 객체로 취급한다. 소멸자도 마찬가지
같은 의미로 생성자의 일반 함수에서 가상함수를 호출하는 경우도 지양해야할 점이다.
한가지 해결책은 해당클래스를 비가상함수로 만들고 파생클래스에서 파라미터를 받아 다시 그 함수를 호출하는 점이 있다.
'C,C++' 카테고리의 다른 글
[Effective C++] 항목 11 : operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자. (0) | 2019.07.25 |
---|---|
[Effective C++] 항목 10 : 대입 연산자는 *this의 참조자를 반환하게 하자 (0) | 2019.07.24 |
[Effective C++] 항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자. (0) | 2019.07.22 |
[Effective C++] 항목 7: 다형성을 가진 기본클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. (0) | 2019.07.18 |
[C] strtok 문자열 자르기 (0) | 2018.10.21 |
댓글