2010-09-02 12 views
5

Böyle bir türetilmiş sınıftaki bir taban sınıfta bir kamu üyesi özel yapmak yapmak istiyorum:Türetilmiş bir sınıfta özel üye değişkeni özel yapabilir miyim?

class A { 
public: 
    int x; 
    int y; 
}; 

class B : public A { 
    // x is still public 
private: 
    // y is now private 
    using y; 
}; 

Ama görünüşe göre bu şekilde kullanılamaz "kullanarak". Bunu C++'da yapmanın bir yolu var mı?

(diğer üyeleri ve hala kamu olması gerektiğini A fonksiyonları vardır çünkü özel devralma kullanamazsınız.)

+1

Bu garip bir tasarım gibi görünüyor. Bunu B sınıfı için yapabilseniz bile, tüm birinin yapması gereken bir işaretçiye ya da A'ya atıfta bulunmaktır ve daha sonra üyeye erişebileceklerdir. – TheUndeadFish

+1

Olası yinelenen [C++: bir temel sınıftan genel olarak miras alma, ancak türetilmiş sınıftaki özel sınıftaki bazı genel yöntemleri nasıl yapabilirim?] (Http://stackoverflow.com/questions/2986891/c-how-to -publicly-devralır-dan-bir-üs-sınıf-ama-makyaj bazı-of-the kamu yöntemleri-fr) –

cevap

3

Kısa cevap: hayır. Liskov ikamesi ve kamu mirasının niteliği, A (yani kamu üyeleri) ile yapabileceğiniz her şeyin B tarafından da yapılmasını gerektirir. Bu, kamu yöntemini gizleyemediğiniz anlamına gelir.

Genel fields'u gizlemeye çalışıyorsanız, yapabileceğiniz fazla bir şey yok.

class B { 
    // x is still public 
    int x() { return a.x(); } 
private: 
    A a; 
    // y is now private since you didn't add a forwarding method for it 
}; 
3

Evet, beyanı technically kullanarak bunu yapmak için izin verir: genel yöntemleri "gizlemek" için böyle bir şey yapabilirdi.

Bunu yaparken bir tasarım mantıklı Ancak ciddi değerlendirmek lütfen yerine using y

ait using A::y kullanmak zorunda.

Birkaç gözlemler:

  1. Sınıfınız kamu veriye sahip olmamalıdır. Bu mümkün olduğunca kaçınılmalıdır. Bu tasarım ilkesine sadık kalırsanız, türetilmiş sınıfta özel yapmanıza gerek olmayabilir.

  2. LSP'a yapıştırın. Temel sınıf bir kamu yöntemine sahipse ve özel miras almadığınız sürece, türetilmiş sınıf temel sınıf yöntemini bu tür bildirimlerle özel hale getirdiğinde istemciler karışacaktır.

İlgili konular