> 백엔드 개발 > C++ > C STL 컨테이너에서 상속하는 것이 위험합니까?

C STL 컨테이너에서 상속하는 것이 위험합니까?

Barbara Streisand
풀어 주다: 2024-11-29 03:45:09
원래의
855명이 탐색했습니다.

Is Inheriting from C   STL Containers Risky?

C STL 컨테이너 상속의 위험

제시되는 질문은 표준 C 컨테이너에서 상속과 관련된 실제 위험이 있는지 여부입니다. 저자는 typedef std::Vector과 같은 typedef를 사용한다고 주장합니다. 요금;이 더 안전한 접근 방식입니다. 그러나 잠재적인 위험을 탐색하기 위해 특정 사용 사례를 제안합니다.

사용 사례

다음 코드 조각을 고려하세요.

#include <vector>
#include <iostream>

void kill_it(std::vector<double>& victim) {
    delete &victim;
}

typedef std::vector<double> Rates;
class Charges: public std::vector<double> { };

int main() {
  std::vector<double>* p1, *p2;
  p1 = new Rates;
  p2 = new Charges;
  kill_it(p2);
  kill_it(p1);
  return 0;
}
로그인 후 복사

저자는 임의로 불운한 사용자가 ???에 오류를 일으킬 수 있다고 제안합니다. Charges(파생 클래스)에서는 문제가 발생하지만 Rates(typedef)에서는 문제가 발생하지 않는 섹션입니다.

가상 소멸자

여기서 핵심 문제는 해당 표준입니다. C 컨테이너에는 가상 소멸자가 없습니다. 따라서 다형성으로 처리할 수 없습니다. 귀하와 귀하의 코드를 사용하는 모든 사용자가 이 원칙을 준수한다면 표준 컨테이너에서 상속하는 것이 본질적으로 잘못된 것은 아닙니다. 하지만 저자는 명확성을 위해 컴포지션을 권장합니다.

상속보다 컴포지션

컨테이너에서 상속하는 것보다 컴포지션을 사용하는 것이 더 깔끔하고 안전합니다. 여기에는 컨테이너의 인스턴스를 멤버 변수로 포함하는 새 클래스를 만드는 작업이 포함됩니다. 이를 통해 클래스 기능을 더 유연하게 제어하고 제어할 수 있습니다.

이 사용 사례에서는 예를 들어 std::Vector의 인스턴스를 포함하는 새로운 Rates 클래스를 정의합니다. 기본 컨테이너를 계속 활용하면서 추가 기능을 추가할 수 있습니다. 또한 이 접근 방식은 기본 컨테이너 구현에 관계없이 새 클래스의 소멸자가 올바르게 처리되도록 보장합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿