Her zaman sanal yok ediciler olmadan bir sınıftan miras kalmaman gerektiğini ve çok fazla dikkat etmediğimi duydum, çünkü çoğu kez miras kullanmadım. Bu kural, polimorfizm kullanmak istemiyor olsanız da geçerlidir, ancak tüm sınıf işlevlerini istiyorsanız ve biraz daha eklemek ister misiniz? Somut olmak gerekirse, aşağıdaki sınıf, polimorfik olarak kullanmadığım sürece, iyi tanımlanmış bir davranışla güvende olur mu? (Türetilmiş nesnelere; diğer bir deyişle silme baz işaretçiler)Sanal yıkıcılar olmadan sınıflardan miras alma
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);
}
};
Tamam mı, yoksa sorun değil, yine de standart kitaplık kapsayıcılarından türememelisiniz. Ayrıca, sınırlar içinde dinamik kapsayıcılara erişme konusunda sorun yaşıyorsanız, büyük ölçekli bir erişim olduğundan büyük resmi algoritmik düşünceye ("0-1-çok" ve "aralıklar") bakmayı tercih edebilirsiniz. genellikle bir * mantık * hatası. –
Sanırım özel örneğinizde, kalıtım, yeniden kullanım için değil, arabirimin yeniden kullanımı için kullanıldığı için miras açısından son derece zarif bir çözüm değildir. Arayüzü yeniden kullanmazsınız, çünkü operatörünüz [] 'std :: vektörü 'olmayan bir istisna atar. Kodu yeniden kullanmak isterseniz, sadece paylaşılan paylaşılan işlevleri kullanın veya (bu durumda olduğu gibi), 'std :: vector'' SomewhatSafeVector' üyesi olun. –
@KerrekSB: İlk neden, neden olmasın? İkincisi, benim böyle bir sorunum yok. Ama bence konteynırları kontrol etmenin öğretim ve hata ayıklama amaçları için iyi bir fikir olacağını düşünüyorum. –