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 sonprivate
por defecto; en unastruct
, los miembros sonpublic
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.