Tiene la razón en el punto n. ° 1. Especificar private
, protected
o public
cuando hereda de una clase base no cambia nada el acceso a la misma clase derivada. Esos especificadores de acceso le dicen al compilador cómo tratar a los miembros de la clase base cuando las instancias de la clase derivada se usan en otro lugar, o si la clase derivada se usa como una clase base para otras clases.
UPDATE: Lo siguiente puede ayudar a ilustrar las diferencias:
class Base
{
private: int base_pri;
protected: int base_pro;
public: int base_pub;
};
Para las clases de derivados de la 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
}
Para las clases de derivados de las 3 clases derivadas:
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
}
Acceso externo a las tres primeras clases derivadas:
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
}
herencia protegida y herencia pública son las mismas? –
@fahad: desde el punto de vista de la clase derivada, sí, lo son. Desde un punto de vista de acceso externo (el último bloque de código en mi respuesta) son bastante diferentes. –