resueltos relaciones programacion polimorfismo persona herencia entre ejercicios derivada clases clase abstracta c++ inheritance

relaciones - polimorfismo en c++



Acceso predeterminado a la herencia de clases (4)

De los documentos estándar, 11.2.2

En ausencia de un especificador de acceso para una clase base, se asume público cuando la clase derivada se define con la estructura de clave de clase y se asume privada cuando la clase se define con la clase de clave de clase .

Por lo tanto, para struct s, el valor predeterminado es public y para class es, el valor predeterminado es private ...

Ejemplos de los documentos estándar en sí,

class D3 : B { / ... / }; // B private by default

struct D6 : B { / ... / }; // B public by default

Supongamos que tengo una clase base y derivada:

class Base { public: virtual void Do(); } class Derived:Base { public: virtual void Do(); } int main() { Derived sth; sth.Do(); // calls Derived::Do OK sth.Base::Do(); // ERROR; not calls Based::Do }

como he visto, deseo acceder a Base :: Do a través de Derived. Obtengo un error de compilación como "clase Base en inaccesible", sin embargo, cuando declaro Derivar como

class Derived: public Base

funciona bien

He leído que el acceso predeterminado a la herencia es público, ¿por qué entonces necesito declarar explícitamente la herencia pública aquí?


El nivel de herencia predeterminado (en ausencia de un especificador de acceso para una clase base) para la class en C ++ es privado. [Para struct es público]

class Derived:Base

Base se hereda de forma privada, por lo que no se puede hacer sth.Base::Do(); inside main() porque Base::Do() es privado dentro Derived


El tipo predeterminado de la herencia es privado. En tu código,

clase B: A

no es más que

clase B: privado A


Es posible que haya leído algo incompleto o engañoso. Para citar a Bjarne Stroustrup de "El lenguaje de programación C ++", cuarta edición, p. 602:

En una class , los miembros son private por defecto; en una struct , los miembros son public por defecto (§16.2.4).

Esto también se aplica a los miembros heredados sin especificador de nivel de acceso.

Una convención generalizada es usar struct solo para la organización de miembros puros de datos. Usaste correctamente una class para modelar e implementar el comportamiento del objeto.