인터페이스와 구현 문의

livey의 이미지

아래 1번 처럼 순수가상함수만 가지고있는 인터페이스 클래스를 만들면
컴파일러는 2번처럼 기본생성자 기본소멸자를 생성할텐데
그렇게 되면 인터페이스와 구현을 완벽하게 분리하지 못하는거 아닌가요?
아니면 다른 일반함수와는 다르게 생성자와 소멸자는 예외적으로 취급하는건가요?

// 1 (소스작성시)
class A {
public:
virtual void func1()=0;
virtual void func2()=0;
};

// 2 (컴파일시)
class A {
public:
A() {}; // 기본 생성자
virtual ~A() {}; // 기본 소멸자
virtual void func1()=0;
virtual void func2()=0;
};

klara의 이미지

생성자와 소멸자는 특별합니다.
오버라이딩된 가상함수를 호출하면 명시적으로 부모 클래스의 가상함수를 호출하지 않는 한, 해당 객체의 가상 함수만이 호출됩니다.
그러나 생성자의 경우는, 자식 클래스 부분을 할당하기 전에 부모 클래스의 할당이 끝나 있어야 제대로된 동작을 보장할 수 있습니다.
마찬가지로 소멸자도 자식부터 부모까지 각각의 클래스의 소멸자가 모두 호출되어야 클래스내에서 할당된 자원을 제대로 해제할 수 있습니다.
따라서 생성자는 반드시 부모부터 자식으로 순서대로 전부 호출되어야 하고, 소멸자는 반대로 자식부터 순서대로 전부 호출되어야 합니다.
상속을 구현할 때 이렇게 하지 않고 자식 객체에서 부모 클래스 부분이 제대로 할당/해제 되도록 할 수 있는 방법이 있는지는 모르겠지만, 아무튼 C++에서는 이렇게 구현되어 있습니다.
그렇기 때문에 아무것도 안하는 생성자와 소멸자라도 반드시 정의되어야 객체를 올바르게 할당/해제할 수 있습니다.

참고로 C++에서 부모를 가지지 않는 클래스의 기본 소멸자는 non-virtual입니다.
상속할 것을 전제로 하는 클래스는 명시적으로 virtual 소멸자를 선언해주어야 합니다.
부모를 가지는 경우에는 부모의 기본 소멸자가 virtual이면 virtual을 쓰던 안쓰던 자동으로 자식의 소멸자는 가상 함수가 되고, 그렇지 않으면 마찬가지로 기본 소멸자는 non-virtual입니다.

livey의 이미지

저도 대충 비슷한 생각을 하고있었는데 그런거였군요.

답변 감사합니다 :)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.