가상 소멸자가없는 클래스로부터 상속해서는 안된다는 말을 항상 들었습니다. 상속을 자주 사용하지 않기 때문에 많은주의를 기울이지 않았습니다. 이 규칙은 다형성을 사용하고 싶지 않지만 모든 클래스 기능을 원한다면 더 적용할까요? 구체적으로 말하자면, 다형 적으로 사용하지 않는 한, 잘 정의 된 행동으로 다음 클래스가 안전할까요? (파생 개체에 즉 더 삭제베이스 포인터 없음)가상 소멸자가없는 클래스로부터 상속 받기
template<typename T>
class SomewhatSafeVector : public std::vector<T>
{
public:
typedef std::vector<T> base;
T& operator[](unsigned n) {
if (n >= base::size())
{
throw IndexOutOfBounds();
}
return base::operator[](n);
}
};
괜찮은지 여부는 신경 쓰지 않아도되지만 표준 라이브러리 컨테이너에서 파생해서는 안됩니다. 또한 범위 내에서 동적 컨테이너에 액세스하는 데 문제가 있으면 큰 그림 알고리즘 사고 ("0-1- 많은"및 "범위")를 고려하는 것이 좋습니다. 범위를 벗어난 액세스는 보통 논리 * 오류. –
상속은 구현 재사용이 아니라 인터페이스 재사용을 의미하기 때문에 특정 사례에서 상속은 굉장히 우아한 해결책이라고 생각합니다. 'operator []'는'std :: vector'가 예외를 throw하지 않기 때문에 인터페이스를 재사용하지 않아도됩니다. 코드를 재사용하고 싶다면 일반 공유 함수를 사용하거나 (이 경우처럼)'std :: vector'를'SomewhatSafeVector'의 멤버로 만듭니다. –
@KerrekSB : 첫 번째 이유는 무엇입니까? 두 번째로, 나는 그런 문제가 없다. 하지만 경계 체크 컨테이너는 교육 및 디버깅 목적에 좋은 아이디어라고 생각합니다. –