2013-08-27 3 views

답변

2

규칙을 알고 있고 소멸자 내에서 객체의 동적 유형이 소멸자가 실행중인 클래스라고 말하는 것이 안전합니다.

실행 B::~B() 있지만, 개체의 유형 B 당신이 다음 f()를 호출하는 경우 (그리고, 당신은 실행 A::~A() 동안 개체의 유형 A입니다 B::f()

에 파견하고, 경우거야 당신은 당신이 추상 클래스의 생성자 (또는 소멸자)에서 당 §10.4 [class.abstract]/6

멤버 함수를 호출 할 수 정의되지 않은 동작을 얻을, 다음 f() 전화;에 가상 전화를 만드는 효과를 순수 가상 함수 direc 그것을보고 ++ 연타로 TLY 또는 간접적으로 객체에 대해 같은 생성자 (또는 소멸자)에서 생성 된 (또는 파괴)되고

test.cc:5:20: warning: call to pure virtual member function 'f'; overrides of 'f' in subclasses are not available in the destructor of 'A' 
    virtual ~A() { this->f(); } 
       ^
test.cc:7:5: note: 'f' declared here 
    virtual void f() = 0; 
    ^
1 warning generated. 

편집, 정의되지 않은

또는 : OP는 가상 순수 편집 out ... 그래서 A::~A()이 실행 중일 때 f()에 대한 가상 호출이 A::f()

+0

본체가 순수 가상 용으로 제공되면 정의되지 않습니다. –

+0

나는 확실하게 질문을했다 .. http://stackoverflow.com/questions/18456450/is-it-safe-to-call-a-pure-virtual-function-in-an-abstract-constructor-destructor –

1

으로 발송됩니다. 참고 : OP는 순수 가상 부품을 제거하기 위해 코드를 편집했습니다.

게시 한 내용으로는 안전하지 않습니다. 상속 계층 구조에서 클래스의 생성자 또는 소멸자에서 가상 함수를 호출하면 평소와 같이 가장 많이 파생 된 함수를 호출하지 않지만 현재 클래스 내에서 정의 된 함수를 호출합니다.

이 경우 ~ A는 함수 본문이없는 A :: f()를 호출하므로 오류입니다. A :: f()에 대한 본문을 제공 한 경우 (클래스 정의 외부의 순수 가상으로이 작업을 수행 할 수 있음), "안전"할 수 있습니다.

관련 문제