인터페이스와 구현 문의
글쓴이: livey / 작성시간: 화, 2012/09/18 - 6:08오후
아래 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;
};
Forums:
생성자와 소멸자는 특별합니다.오버라이딩된 가상함수를
생성자와 소멸자는 특별합니다.
오버라이딩된 가상함수를 호출하면 명시적으로 부모 클래스의 가상함수를 호출하지 않는 한, 해당 객체의 가상 함수만이 호출됩니다.
그러나 생성자의 경우는, 자식 클래스 부분을 할당하기 전에 부모 클래스의 할당이 끝나 있어야 제대로된 동작을 보장할 수 있습니다.
마찬가지로 소멸자도 자식부터 부모까지 각각의 클래스의 소멸자가 모두 호출되어야 클래스내에서 할당된 자원을 제대로 해제할 수 있습니다.
따라서 생성자는 반드시 부모부터 자식으로 순서대로 전부 호출되어야 하고, 소멸자는 반대로 자식부터 순서대로 전부 호출되어야 합니다.
상속을 구현할 때 이렇게 하지 않고 자식 객체에서 부모 클래스 부분이 제대로 할당/해제 되도록 할 수 있는 방법이 있는지는 모르겠지만, 아무튼 C++에서는 이렇게 구현되어 있습니다.
그렇기 때문에 아무것도 안하는 생성자와 소멸자라도 반드시 정의되어야 객체를 올바르게 할당/해제할 수 있습니다.
참고로 C++에서 부모를 가지지 않는 클래스의 기본 소멸자는 non-virtual입니다.
상속할 것을 전제로 하는 클래스는 명시적으로 virtual 소멸자를 선언해주어야 합니다.
부모를 가지는 경우에는 부모의 기본 소멸자가 virtual이면 virtual을 쓰던 안쓰던 자동으로 자식의 소멸자는 가상 함수가 되고, 그렇지 않으면 마찬가지로 기본 소멸자는 non-virtual입니다.
그렇군요
저도 대충 비슷한 생각을 하고있었는데 그런거였군요.
답변 감사합니다 :)
댓글 달기