C++ 추상 클래스를 상속받은 파생 클래스에 관해서 궁금합니다.

greathero의 이미지

책에 나와있는 예제를 보고 문득 궁금해서 질문드려요.

public Parent {
public:
  virtual ~Parent();
  ...
};
 
class Child: public Parent {
public:
  Child(...) { ... } 
  virtual ~Child() { }
  ... // 순수 가상 함수 구현
};

Child는 소멸자를 자체적으로 정의해서 쓰면 될텐데 왜 가상소멸자로 선언했을까요?
Child를 상속받을 또 다른 파생클래스를 생각해서 이런거라면 이해가 되겠지만...
혹시 또다른 이유가 있을까요?

klara의 이미지

Child를 상속받을 또 다른 파생클래스를 생각해서 이런거라면 이해가 되겠지만... << Child를 또 상속받는 경우라도 변하는 점은 없습니다.

부모 클래스에서 virtual 함수로 선언된 함수는 자식클래스에서 virtual 키워드를 명시하던 하지않던 무조건 가상 함수가 됩니다.
이는 소멸자에도 해당되는 내용이며, 여기서 Child의 소멸자에 virtual 키워드가 있던 없던 결과는 동일합니다.
이 코드에 virtual이 붙어있는 것은 순전히 코드를 작성한 사람의 코딩 스타일이라고 할 수 있습니다.

상량의 이미지

다음 경우를 생각해보세요:

Parent* ParentPointer = new Child();
delete ParentPointer;

만약 소멸자가 virtual이 아니면 저 포인터를 삭제할때 Parent의 메모리만 정리되고 Child는 그대로 남아있어서 메모리가 리크돼어버려요. 버츄얼 소멸자를 설정해줘야 delete 할때 ParentPointer의 소멸자를 오버로딩해서 메모리를 다 정리하게 됍니다.

즉, 버츄얼소멸자가 아니면 delete 할때 ~Parent를 호출하게 되는데 버츄얼이면 delete을 Parent*에 대해 해도 ~Child를 불러요.

출처는 스택오버플로! 사실 완전히 읽지는 않아서 좀 두서가 없지만, 포인터를 삭제할때 관련되는겁니다.

greathero의 이미지

음... 제가 알고싶었던건 Child를 가상 소멸자로 지정한 이유였는데
윗분이 코딩 스타일이라고 말씀해주셨으니 ㅎㅎ

상량의 이미지

앞으로 상속받을 클래스에 대한 예비라고 생각되네요.

Edit: 한글 이해능력이 떨어진다아아 ㄷㄷ;
죄송합니다 ㅜㅜ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.