resueltos programacion polimorfismo persona orientada objetos herencia ejercicios ejemplos derivada constructores clases clase c++ class inheritance struct

programacion - polimorfismo c++



C++: ¿Puede una estructura heredar de una clase? (9)

En C ++

struct A { /* some fields/methods ... */ };

es equivalente a:

class A { public: /* some fields/methods ... */ };

Y

class A { /* some fields/methods ... */ };

es equivalente a:

struct A { private: /* some fields/methods ... */ };

Eso significa que los miembros de una estructura / clase son por defecto públicos / privados .

El uso de struct también cambia la herencia predeterminada a public , es decir,

struct A { }; // or: class A { }; class B : A { };

es equivalente a

struct A { }; // or: class A { }; struct B : private A { };

Y al revés, esto

struct A { }; // or: class A { }; struct B : A { };

es equivalente a:

struct A { }; // or: class A { }; class B : public A { };

Resumen: Sí, una struct puede heredar de una clase. La diferencia entre las palabras clave struct y struct es solo un cambio en los especificadores privados / públicos predeterminados.

Estoy viendo la implementación de una API que estoy usando.

Noté que una estructura hereda de una clase y me detuve para reflexionar sobre ella ...

Primero, no vi en el manual de C ++ con el que estudié que una estructura podría heredar de otra estructura:

struct A {}; struct B : public A {};

Supongo que, en tal caso, la estructura B hereda de todos los datos del paquete A. ¿Podemos declarar miembros públicos / privados en una estructura?

Pero noté esto:

class A {}; struct B : public A {};

De mi manual en línea de C ++:

Una clase es un concepto expandido de una estructura de datos: en lugar de contener solo datos, puede contener datos y funciones.

¿Es válida la herencia anterior incluso si la clase A tiene algunas funciones miembro? ¿Qué sucede con las funciones cuando una estructura las hereda? ¿Y qué ocurre con el reverso: una clase que hereda de una estructura?

En términos prácticos, tengo esto:

struct user_messages { std::list<std::string> messages; };

Y solía iterar sobre él como este foreach message in user_messages.messages .

Si deseo agregar funciones de miembro a mi estructura, ¿puedo cambiar su declaración y "promocionarla" a una clase, agregar funciones y aún así iterar sobre mis mensajes de usuario_mensajes como lo hice antes?

Obviamente, todavía soy un novato y todavía no tengo claro cómo las estructuras y las clases interactúan entre sí, cuál es la diferencia práctica entre las dos, y cuáles son las reglas de herencia ...


La única diferencia entre una estructura y una clase es el nivel de acceso predeterminado para los miembros (privado para las clases, público para las estructuras). Esto significa que una estructura debería ser capaz de heredar de una clase, y viceversa.

Sin embargo, generalmente hay una diferencia en cómo se usan las estructuras y las clases que no son obligatorias para el estándar. Las estructuras a menudo se usan para datos puros (u objetos sin polimorfismo según la preferencia de su proyecto) y las clases se usan para los otros casos. Enfatizo que esto es solo una diferencia estilística y no requerida.


Lo principal para entender es que las estructuras provienen de C, mientras que las clases son C ++. Esto significa que, aunque las estructuras SON ciudadanos orientados a objetos de primera clase, también tienen un propósito heredado, que es la razón por la cual las clases están separadas y las estructuras tienen acceso público por defecto. Sin embargo, una vez que se hace esto, son absoluta y totalmente idénticos e intercambiables en todos los sentidos.


Sí, una struct puede heredar de una clase. struct y class difieren solo en el especificador de acceso asumido para los miembros y para una clase base (o estructura) si no se especifica explícitamente en C ++. Para las estructuras es public . Para las clases es private .

La oración que citas del manual trata sobre el concepto de una clase en C ++, en comparación con el concepto de una estructura de datos en C. En C ++ se introdujo una nueva palabra clave: la class refleja mejor el cambio en el concepto, pero por compatibilidad con código en C, se dejó una vieja struct palabras clave y su significado es como se describió anteriormente.


Sí. Struct puede heredar de una clase y viceversa. La regla de accesibilidad es

$ 11.2 / 2- "En ausencia de un especificador de acceso para una clase base, se asume public cuando la clase derivada se declara como struct y se asume private cuando la clase se declara como clase."

EDICION 2: Entonces puedes cambiar tu clase como: Tenga en cuenta que es una mala idea tener miembros de datos públicos por lo general.

class user_messages { // i also changed the name when OP was modified :) public: std::list<std::string> messages; };


Una clase no heredará públicamente de una estructura. Una estructura heredará públicamente de una clase o una estructura.

class A { public: int a; }; struct B : A {};

B b; ba = 5; //DE ACUERDO. a es accesible

class A { public: int a; }; struct B : public A {};

Significa lo mismo. B b; ba = 5; //DE ACUERDO. a es accesible

struct A {int a;}; class B : A {};

B b; ba = 5; //NO ESTÁ BIEN. a NO es accesible

struct A {int a;}; class B : public A {};

B b; ba = 5; //DE ACUERDO. a es accesible

Finalmente:

class A {int a;}; class B : A {};

B b; ba = 5; //NO ESTÁ BIEN. a NO es accesible

class A {int a;}; class B : public A {};

B b; ba = 5; //NO ESTÁ BIEN. a NO es accesible


Una estructura es lo mismo que una clase, excepto que una clase predetermina sus miembros a privada, mientras que una estructura predetermina sus miembros a pública. Como resultado, sí, puedes heredar entre los dos. Ver en C ++, ¿puedo derivar una clase de una estructura ?


struct y class son bastante intercambiables, solo con valores predeterminados diferentes en las clases predeterminadas a herencia privada y miembros, estructuras a público. La palabra clave class (y no struct) se debe usar para, por ejemplo. "plantilla <clase T>".

Dicho esto, muchos programadores usan los dos para dar una ligera sugerencia a un programador que lea el código: al usar una estructura, sugiere sutilmente un diseño OO menos encapsulante. Una estructura puede ser utilizada internamente en una biblioteca, donde obtener las agallas de todo es juego limpio, mientras que las clases se usan en el límite donde los cambios de la API serían inconvenientes para los clientes y una mejor abstracción es útil. Esta muy flexible convención ha surgido de la diferencia en accesibilidad por defecto: los programadores hacen lo que es más fácil a menos que haya un beneficio, y no escribir especificadores de acceso es bueno cuando es posible.


Sí, struct puede heredar de la clase en C ++.

En C ++, las clases y struct son las mismas excepto por su comportamiento predeterminado con respecto a la herencia y los niveles de acceso de los miembros.

Clase C ++

  • Herencia predeterminada = privada
  • Nivel de acceso predeterminado para las variables y funciones del miembro = privado

Estructura de C ++

  • Herencia predeterminada = pública
  • Nivel de acceso predeterminado para variables y funciones del miembro = public