C에서 추상 기본 클래스를 정의할 때 다음과 같이 가상 소멸자를 순수 가상으로 선언하고 싶은 유혹이 있을 수 있습니다. 아래 코드 조각에 나와 있습니다.
class A { public: virtual ~A() = 0; };
이 구문은 특정 경우에 유효하지만 MSVC와 같은 컴파일러에는 런타임 충돌을 일으킬 수 있는 숨어 있는 위험이 있습니다.
위 코드의 문제는 가상 소멸자가 다음으로 선언된다는 것입니다. 구현을 제공하지 않고 순수해야 합니다. 이는 소멸자의 동작이 구체적인 파생 클래스에 위임됨을 의미합니다. 그러나 A 유형의 객체 자체가 소멸되면 해당 소멸자가 호출되며, 구현이 부족하면 정의되지 않은 동작이 발생하게 됩니다.
일반적인 시나리오에서는 추상 기본 클래스 A에서 파생 클래스의 개체를 삭제하려고 시도하면 궁극적으로 A의 소멸자가 호출됩니다. 구현하지 않으면 특정 플랫폼에서 purecall 핸들러 호출 및 프로그램 충돌과 같은 정의되지 않은 동작이 발생할 수 있습니다.
이 문제를 해결하려면 추상 기반 클래스의 소멸자는 본문이 비어 있더라도 명시적으로 구현되어야 합니다. 아래의 수정된 코드 조각은 이를 보여줍니다.
class A { public: virtual ~A() = 0; }; inline A::~A() { }
A의 소멸자에 대한 빈 구현을 제공함으로써 직접 호출되거나 파생 클래스를 통해 호출될 때 해당 동작이 정의되도록 할 수 있습니다.
위 내용은 C에서 순수 가상 소멸자를 구현해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!