항목 14. 베이스 클래스에서 소멸자는 가상 함수로 선언해야 한다. 2008/05/31 14:36 수정
부재 : 모든 베이스 클래스가 아닌, 다형성을 지닌 클래스에 대해선 반드시 가상소멸자를 선언해야 한다.
이유.
1. 베이스 클래스로 자식 클래스의 소멸자를 호출하기 위해서다.
- 자식(유도)클래스로 동적메모리 할당 후 부모클래스의 포인터로 받아서 사용할 경우가 생긴다면
자식(유도) 클래스의 소멸자를 꼭 호출해야지만 안전한 프로그래밍이 가능해 지기 때문이다.
문제 해결
1. 베이스 클래스의 소멸자를 virtual 의 키워드를 넣어주면 된다.
주의 해야 할점
1. 소멸자의 호출 시기를 분명히 숙지하고 있어야 한다.
2. 동적메모리를 사용하는 클래스일 경우, 매우 주의깊게 써야 한다
덧붙여
1. 추상 클래스를 만들고(추상 클래스란 순수 가상 함수가 있는 클래스를 말한다, 추상 클래스는 객체를 만들수가 없다.) 자식 프로세스가 가지고 있는 여러 함수들을 추상 클래스에서 가상함수로 받아 들이면, 컨트롤 클래스로 사용 할수 있게 된다.
2. 추상 클래스의 순수 가상 소멸자를 클래스 외부에 선언해 두어야 한다
예) 정적 멤버 변수 처럼. 2008/05/31 14:36 수정
2. 추상 클래스의 순수 가상 소멸자는 꼭 정의해 두어야 한다.
왜냐하면, 파생클래스의 소멸자가 베이스 클래스의 순수 가상 소멸자는를 호출해 주지 않기 때문이다.
개인적인 생각
사실 이런 문법은 사용하기 까다롭지만, 베이스 클래스로 그 자식 클래스들을 컨트롤 할수 있는 장점이 있다.
이것은 한 자료구조에 이 베이스클래스의 포인터를 담아 관리한다면, 모든 클래스를 컨트롤 할수 있는 막강한 기능을 제공한다.
부재 : 모든 베이스 클래스가 아닌, 다형성을 지닌 클래스에 대해선 반드시 가상소멸자를 선언해야 한다.
이유.
1. 베이스 클래스로 자식 클래스의 소멸자를 호출하기 위해서다.
- 자식(유도)클래스로 동적메모리 할당 후 부모클래스의 포인터로 받아서 사용할 경우가 생긴다면
자식(유도) 클래스의 소멸자를 꼭 호출해야지만 안전한 프로그래밍이 가능해 지기 때문이다.
문제 해결
1. 베이스 클래스의 소멸자를 virtual 의 키워드를 넣어주면 된다.
주의 해야 할점
1. 소멸자의 호출 시기를 분명히 숙지하고 있어야 한다.
2. 동적메모리를 사용하는 클래스일 경우, 매우 주의깊게 써야 한다
덧붙여
1. 추상 클래스를 만들고(추상 클래스란 순수 가상 함수가 있는 클래스를 말한다, 추상 클래스는 객체를 만들수가 없다.) 자식 프로세스가 가지고 있는 여러 함수들을 추상 클래스에서 가상함수로 받아 들이면, 컨트롤 클래스로 사용 할수 있게 된다.
2. 추상 클래스의 순수 가상 소멸자를 클래스 외부에 선언해 두어야 한다
예) 정적 멤버 변수 처럼. 2008/05/31 14:36 수정
2. 추상 클래스의 순수 가상 소멸자는 꼭 정의해 두어야 한다.
왜냐하면, 파생클래스의 소멸자가 베이스 클래스의 순수 가상 소멸자는를 호출해 주지 않기 때문이다.
개인적인 생각
사실 이런 문법은 사용하기 까다롭지만, 베이스 클래스로 그 자식 클래스들을 컨트롤 할수 있는 장점이 있다.
이것은 한 자료구조에 이 베이스클래스의 포인터를 담아 관리한다면, 모든 클래스를 컨트롤 할수 있는 막강한 기능을 제공한다.
'책 정리 > Effective C++ 2판' 카테고리의 다른 글
항목 18. 최소한의 완전한 클래스 인터페이스를 구축한다. (0) | 2008.05.09 |
---|---|
3부, 클래스와 함수 : 설계 및 선언 (0) | 2008.05.08 |
항목 17. operator=에서 재귀치환을 검사한다. (0) | 2008.05.08 |
항목 16. operator=에서 모든 데이터 멤버들로의 치환을 수행한다. (0) | 2008.05.08 |
항목 15. operator= 이 *this에 대한 레퍼런스(reference)를 리턴(return)하도록 한다. (0) | 2008.05.08 |
항목 13. 클래스에 선언된 순서에 따라 멤버 초기화 리스트에 멤버들을 나열한다. (0) | 2008.05.07 |
항목 12. 생성자에서 치환보다는 초기화를 사용한다. (0) | 2008.05.07 |
항목 11. 동적으로 할당되는 메모리를 갖는 클래스를 위해서는 복사 생성자와 치환 연산자를 선언하라 (0) | 2008.05.07 |
2부까지 종료 (0) | 2008.05.07 |
항목 10. operator new를 작성한다면 operator delete도 작성한다. (0) | 2008.05.07 |
최근댓글