poo - en C++, ¿puedo derivar una clase de una estructura
herencia programacion (3)
Por supuesto que lo eres. Lo que es diferente con respecto a la herencia es que si defines una clase, heredará privada de otras clases / estructuras. Si define una estructura y la deriva de una clase o estructura, será una herencia pública por defecto:
// the following two are equivalent except that one time class is
// used and the other time struct
struct f : g { };
class f : public g { };
Si se pregunta cómo debería envolver las estructuras C, las insertaría como miembro en la clase. Debido a que las estructuras C no fueron diseñadas para ser heredadas de (piense en el destructor protegido ni virtual en las estructuras C - no pueden tener uno). Son agregados simples que recopilan datos. Y ponerlos como miembros los usa como tales (como en "un punto tiene un par de coordenadas x e y").
Las estructuras C también exponen a los miembros que posiblemente no deberían estar expuestos en la clase. La contención permite un control preciso de lo que está expuesto y lo que no por las funciones de obtener / establecer y aún así puedes dejar que te dé una copia o referencia al objeto desnudo C struct contenido.
La pregunta lo dice todo realmente. ¿Se me permite derivar una clase de una estructura, o debo crear una clase que incruste mi estructura y defina los constructores de copia y un operador = para moverme entre las dos?
Sí. puedes derivar una clase de una estructura. En C ++, una estructura es simplemente una clase donde el acceso predeterminado es público en lugar de privado. Derivar una clase de una estructura que solo agrega funciones miembro no viruales y / o funciones estáticas es una técnica útil para proporcionar una interfaz C ++ mientras se mantiene la compatibilidad con una API de estilo C.
Este es exactamente el enfoque utilizado por MFC para muchas de las estructuras C (al contrario de lo que usted dice en su pregunta).
Por ejemplo, la clase CRect se deriva públicamente de struct tagRECT (el nombre más comúnmente utilizado RECT es un tipodedf para struct tagRECT). Debido a que struct tagRECT define todos los miembros de datos, y CRect agrega solo funciones de miembros no virtuales, el diseño de memoria de CRects y RECT es idéntico: puede usar un CRect como argumento para cualquier función que se espere un RECT y viceversa.
En C ++, struct
es (casi) sinónimo de una class
(excepto por el diferente nivel de acceso predeterminado), así que sí, puedes.
struct A {
// fields are public by default
};
class B: public A {
// fields are private by default
};
No estoy familiarizado con MFC, pero parece un intento de mantener las API C y C ++.