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 sonprivatepor defecto; en unastruct, los miembros sonpublicpor 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.