>백엔드 개발 >C++ >C STL 컨테이너에서 파생해야 합니까?

C STL 컨테이너에서 파생해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-01 13:46:13476검색

Should You Derive from C   STL Containers?

C STL 컨테이너에서 파생 시 발생할 수 있는 위험

C 프로그래밍 영역에서는 파생의 장점에 대한 논쟁이 자주 발생합니다. 표준 라이브러리의 컨테이너(벡터, 목록 등과 같은 C 표준 라이브러리와 함께 제공되는 컨테이너)에서 또는 간단히 typedef를 사용하여 이를 표현합니다(새 유형을 정의하지 않고 기존 유형에 대한 새 이름 만들기). 두 접근 방식 모두 장점을 제공하지만 STL 컨테이너에서 파생하는 것과 관련된 잠재적인 위험을 인식하는 것이 중요합니다.

파생을 사용할 때 벡터와 같은 표준 컨테이너는 그렇지 않다는 점을 기억하는 것이 중요합니다. 소멸자를 가상으로 선언합니다. 즉, 이러한 컨테이너 중 하나에서 파생되고 파생 클래스에 가상이 아닌 소멸자를 정의하는 경우 기본 클래스에 대한 포인터를 사용하여 해당 파생 클래스의 개체를 삭제하려고 하면 문제가 발생하게 됩니다.

이 문제를 설명하려면 다음 예를 고려하세요.

class Rates : public std::vector<double> { /* ... */ };

int main() {
    std::vector<double>* p = new Rates;
    delete p;  // This will invoke the non-virtual ~std::vector<double>(), potentially leading to problems
}

이 경우 포인터 p에서 삭제 연산자가 호출되면 기본 클래스의 소멸자를 호출합니다. 표준::벡터, 파생 클래스인 Rates의 소멸자 대신. 이는 파생 클래스에 파기 중에 정리해야 하는 추가 리소스가 포함되어 있는 경우 문제가 발생할 수 있습니다.

따라서 STL 컨테이너에서 파생하면 함수 오버로딩 및 템플릿 전문화 활성화와 같은 특정 이점이 있지만 매우 중요합니다. 주의를 기울이고 기본 클래스 소멸자를 가상이 아닌 소멸자로 재정의하지 않도록 하세요. 다형성 동작이 필요한 경우 상속 대신 합성 사용을 고려해보세요.

위 내용은 C STL 컨테이너에서 파생해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.