2013-09-05 3 views
1

우리는 3 개의 클래스가 있다고 가정 해 봅시다 : 부모, 자식 및 기타.기본 소멸자가 클래스에 충분할 때?

class Parent: { 
public: 
    Parent(std::string title): m_title(title) { } 
    void setTitle (std::string title); 
private: 
    std::string m_title; 
}; 

class Child: public Parent { 
public: 
    Child(std::string title) { setTitle(title); } 
private: 
    Other object; 
}; 

class Other { 
public: 
    Other() : m_body("") { } 
    std::string body(); 
    void setBody(std::string); 
private: 
    std::string m_body; 
}; 

이 모든 클래스에 기본 소멸자를 사용할 수 있습니까?

필자는 메모리를 수동으로 할당하지 않기 때문에 메모리 할당을 신경 쓰지 않아도됩니다.

큰 질문 : 기본 소멸자가 충분할 때 일반적인 규칙이 있습니까?

+0

생성자에서 명시 적으로 항목을 만들거나 할당하는 경우 소멸자에서 삭제하거나 해제해야합니다. 예제에서는 소멸자가 필요 없으므로 여기에서는 그렇게하지 않습니다. –

+0

어쨌든'Child' 클래스에서 생성자에 대한 초기화 자 목록을 사용할 수 있습니다 :'Child (std :: string title) : Parent (title) {}' –

+0

거기에서 메모리 할당의 관점에서 생성자를 정의 할 필요가 없습니다. – user2672165

답변

4

Parent에 대한 가상 소멸자를 정의해야하지만 소멸자의 본문은 C++ 11에서 기본값이거나 비어 있습니다. 여전히 기본 소멸자이지만, Parent에 대한 포인터를 통해 deleteChild이 가능하도록 명시 적으로 정의해야합니다.

다형성을 고려하지 않고 클래스가 파괴시 추가 작업을 수행해야하는 경우에만 소멸자를 정의하면됩니다. 예를 들어 클래스는 수동으로 관리되는 리소스를 할당 해제하거나 어딘가에서 등록을 취소해야 할 수 있습니다. 또 다른 특수한 경우는 스코프 가드 (scard guard)로, 파괴 목적으로 무언가를하는 것이 유일한 목적입니다.

거의 모든 클래스에는 기본 소멸자 만 있습니다. 명시 적 소멸자 정의를 볼 때 나는 의심 스럽기 시작합니다.

+1

부모 개체를 통해 자식 개체가 삭제되면 어떻게 될까요? –

+0

@NeilKirk : 사실, 처음에는 상속을 알지 못했습니다. –

+0

그래서 C++에서는 소멸자가 필요하지 않도록 클래스를 설계하는 것이 더 나은 습관입니까? (조상 클래스의 가상 소멸자 제외) – Pood1331

2

큰 질문 : 기본 소멸자가 충분한 경우 일반적인 규칙이 있습니까?

해당 클래스의 소멸자를 작성해야한다면 어떻게해야합니까?

~Parent() { } 

~Child() { } 

~Other() { } 

만약 그렇게된다면, 쓸 필요가 없습니다.

+3

부모 개체를 통해 자식 개체가 삭제되면 어떻게됩니까? –

+0

그러면 '부모'소멸자가 위와 같지 않겠습니까? –

4

Child 개체를 가리키는 Parent에 대한 포인터가 있고 Parent에 가상 소멸자가없는 경우 Child의 소멸자가 호출되지 않습니다. 따라서 부모는 가상 소멸자가 필요합니다. (이 시나리오가 결코 발생하지 않을 것이라는 것을 보장하지 않는다면).

자식 코드 샘플에 소멸자가 필요하지 않습니다. 적절한 하나가 자동으로 생성되며, 고정 소멸자가 가상 ​​코드가되면 가상 코드가됩니다.

관련 문제