C STL 컨테이너 상속의 위험
제시되는 질문은 표준 C 컨테이너에서 상속과 관련된 실제 위험이 있는지 여부입니다. 저자는 typedef std::Vector
사용 사례
다음 코드 조각을 고려하세요.
#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
위 내용은 C STL 컨테이너에서 상속하는 것이 위험합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!