2010-03-21 18 views
5

C++ SSS GenelÖzel türetilmiş bir sınıftan temel sınıfına işaretçi atmalı mıyım?

, bir özel türetilmiş sınıfın bir üyesi fonksiyonu veya arkadaş kaynaktan sayılı

Bu bulunan, temel sınıf ilişki bilinmektedir ve PrivatelyDer * ürününden Base * 'a (veya PrivatelyDer & Base &) kadar olan yukarı doğru güvenlidir; döküme gerek yok veya önerilir. PrivatelyDer özel bir kararına dayanarak ve önceden bildirilmeksizin değiştirilebilir olduğunu bunun beri PrivatelyDer kullanıcıları bu güvensiz dönüşüm kaçınmalıdır Ancak

.

Yukarıdaki kelimeler nasıl anlaşılır? Açıklamanın doğru ya da doğru olduğunu düşünmüyorum.

ben açıklama doğru olduğunu düşünüyorum bu

class A{ 
}; 

class B: private A{ 
}; 

int main(){ 

    B *b = new B(); 
    A *a = new A(); 

    a = b;     //wrong 
    a = (A*)b;   //right 

} 
+2

(A erişilemez nokta), ve, ikincisi, bir Cı-tür döküm kullanır? – UncleBens

+0

evet haklısınız, yorumlamak hepimizin bildiği gibi kötülüktür. Son satırda yaptığı şey iyi bir uygulama değildir –

cevap

4

Tamamen mekanik bir bakış açısından, haklısınız: özel bir ana sınıfa yapılacak bir yayın, çalışacak ve çalışma sonuçları üretecek.

Sık sorulan soru, tasarım bakış açısından genellikle yanlıştır. Özel mirasın özel anlamını vermesi gerekiyor - başka bir deyişle, işe yarayabilse bile, bunun işe yarayacağını bilmemelisiniz ve bir noktada çalışmayı bırakabilir - çünkü resmi olarak bir uygulama detayıdır, Genel arayüzün bir parçası olarak, kaliteyi kullanmadan sınıfı yeniden uygulayabilirler. Bu noktada, oyuncu artık işe yaramazdı (ancak oyuncu kadrosu kullandığın için muhtemelen derhal çalışamayacak bir şey yapmamanız gereken bir şeyden gitmiş olmanız hakkında sizi uyarmayacaktır. hiç de).

Düzeltme: Evet, , yapmıyorsa, mutlaka çalışır. Standardın §4.4/7'sine göre:

...(Isteğe bağlı olarak bir const_cast işlemi takip eder), aşağıdaki static_cast ve reinterpret_cast işlemleri açık tür dönüşüm döküm gösterimi kullanılarak gerçekleştirilebilir, temel sınıf tipi erişilebilir olmasa bile:

- bir türetilmiş bir sınıf türü veya türetilen bir sınıf türünün bir nesnesine bir işaretçi, bir işaretçiye veya bir kesin dizgeli temel sınıf türüne, sırasıyla dönüştürülebilir;

[vurgulanıyor] burada reinterpret_cast` `eşdeğer, örtülü döküm derlememektedir

+0

Hayır, oyuncu mutlaka çalışmayacak. –

+0

Doğru, bugün yeni bir şey öğrendim. :-) –

+0

@Konrad: Yeni bir şey öğrenmekten emin olmadığım nadir zamanlardan biri çok güzel bir şeydi! Neredeyse bilemediğim bir şeydi, çünkü o zaman onu kullanmak için bir cazibe olmazdı. :-) –

1

gibi bir kod var. Bu, B - A arası bir dökümün mümkün olmasına rağmen, yapılmaması gerektiğini söylüyor. Nedeni mirasın özel olması ve B uygulama sınıfının kullanıcılarının umursamadığı bir uygulama detayı olduğu düşünülmelidir. Bu, private işaretli herhangi bir şeyle aynı kurallardır - bu, sınıfa iç olarak düşünülebilir. Dış istemciler yalnızca public işlevlerine ve özniteliklerine güvenmelidir - public devralma dahil. Şahsen ben hiçbir zaman özel miras için herhangi bir kullanım bulamadım - bence bileşimi kullanmak genellikle daha iyi olur diye düşünüyorum.

+0

@Anders: özel sınıflama, politika sınıflarıyla ("std :: allocator" gibi) birleştirildiğinde anlamlıdır: bu tür sınıflar genellikle boştur. Onları özel üyeler olarak kullanmak hala hafızayı tüketecektir, çünkü bir üyenin her üyesi, belleğe ihtiyaç duymasa bile, ayrı bir adrese sahip olmalıdır. Ancak onlardan miras alma, gereksiz belleği tüketmez. –

İlgili konular