2009-02-23 13 views

Respuesta

33

En C++ struct es (casi) un class (excepto en el nivel de acceso predeterminado diferente), así que sí, puede.

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 tanto la API de C y C++.

+0

Gracias por eso. Estaba bastante seguro de que estaba bien, pero nunca lo había visto en la práctica. –

9

Por supuesto que sí. Lo que es diferente con respecto a la herencia es que si defines una clase, heredará privada de otras clases/estructuras. Si se define una estructura y derivarla de una clase o estructura, que 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 usted se pregunta cómo se debe envolver C estructuras - Me gustaría incorporarlos 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.

7

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.

Cuestiones relacionadas