Sei corretto al punto 1. Specificare private
, protected
o public
quando l'ereditarietà da una classe di base non modifica nulla in senso di accessibilità sulla classe derivata stessa. Questi specificatori di accesso dicono al compilatore come trattare i membri della classe base quando le istanze della classe derivata sono usate altrove o se la classe derivata sembra essere usata come classe base per altre classi.
UPDATE: Possono aiutare ad illustrare le differenze:
class Base
{
private: int base_pri;
protected: int base_pro;
public: int base_pub;
};
Per classi derivate dalla base:
class With_Private_Base : private Base { void memberFn(); };
class With_Protected_Base : protected Base { void memberFn(); };
class With_Public_Base : public Base { void memberFn(); };
// this would be the same for all of the above 3 classes:
void With_PXXX_Base::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
Per classi derivate dalle 3 classi derivate:
class A : public With_Private_Base { void memberFn(); }
void A::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // error: `int Base::base_pro' is protected
base_pub = 1; // error: `int Base::base_pub' is inaccessible
}
class B : public With_Protected_Base { void memberFn(); }
void B::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
class C : public With_Public_Base { void memberFn(); }
void C::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
Accesso esterno alle prime tre classi derivate:
void main()
{
With_Private_Base pri_base;
pri_base.base_pri = 1; // error: `int Base::base_pri' is private
pri_base.base_pro = 1; // error: `int Base::base_pro' is protected
pri_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible
With_Protected_Base pro_base;
pro_base.base_pri = 1; // error: `int Base::base_pri' is private
pro_base.base_pro = 1; // error: `int Base::base_pro' is protected
pro_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible
With_Public_Base pub_base;
pub_base.base_pri = 1; // error: `int Base::base_pri' is private
pub_base.base_pro = 1; // error: `int Base::base_pro' is protected
pub_base.base_pub = 1; // OK
}
fonte
2010-01-28 18:41:18
l'ereditarietà e l'eredità pubblica sono uguali? –
@fahad: dal punto di vista della classe derivata, sì, lo sono. Da un punto di vista di accesso esterno (l'ultimo blocco di codice nella mia risposta) sono piuttosto diversi. –