C++ 추상 클래스를 상속받은 파생 클래스에 관해서 궁금합니다.
글쓴이: greathero / 작성시간: 월, 2013/03/11 - 3:52오후
책에 나와있는 예제를 보고 문득 궁금해서 질문드려요.
public Parent { public: virtual ~Parent(); ... }; class Child: public Parent { public: Child(...) { ... } virtual ~Child() { } ... // 순수 가상 함수 구현 };
Child는 소멸자를 자체적으로 정의해서 쓰면 될텐데 왜 가상소멸자로 선언했을까요?
Child를 상속받을 또 다른 파생클래스를 생각해서 이런거라면 이해가 되겠지만...
혹시 또다른 이유가 있을까요?
Forums:
Child를 상속받을 또 다른 파생클래스를 생각해서
Child를 상속받을 또 다른 파생클래스를 생각해서 이런거라면 이해가 되겠지만... << Child를 또 상속받는 경우라도 변하는 점은 없습니다.
부모 클래스에서 virtual 함수로 선언된 함수는 자식클래스에서 virtual 키워드를 명시하던 하지않던 무조건 가상 함수가 됩니다.
이는 소멸자에도 해당되는 내용이며, 여기서 Child의 소멸자에 virtual 키워드가 있던 없던 결과는 동일합니다.
이 코드에 virtual이 붙어있는 것은 순전히 코드를 작성한 사람의 코딩 스타일이라고 할 수 있습니다.
아닙니다.
다음 경우를 생각해보세요:
Parent* ParentPointer = new Child();
delete ParentPointer;
만약 소멸자가 virtual이 아니면 저 포인터를 삭제할때 Parent의 메모리만 정리되고 Child는 그대로 남아있어서 메모리가 리크돼어버려요. 버츄얼 소멸자를 설정해줘야 delete 할때 ParentPointer의 소멸자를 오버로딩해서 메모리를 다 정리하게 됍니다.
즉, 버츄얼소멸자가 아니면 delete 할때 ~Parent를 호출하게 되는데 버츄얼이면 delete을 Parent*에 대해 해도 ~Child를 불러요.
출처는 스택오버플로! 사실 완전히 읽지는 않아서 좀 두서가 없지만, 포인터를 삭제할때 관련되는겁니다.
이건 Parent가 가상 소멸자로 지정한 이유같은데...
음... 제가 알고싶었던건 Child를 가상 소멸자로 지정한 이유였는데
윗분이 코딩 스타일이라고 말씀해주셨으니 ㅎㅎ
앞으로 상속받을 클래스에 대한 예비라고 생각되네요.
앞으로 상속받을 클래스에 대한 예비라고 생각되네요.
Edit: 한글 이해능력이 떨어진다아아 ㄷㄷ;
죄송합니다 ㅜㅜ
댓글 달기