Así que estaba jugando con las características de C ++ y descubrí que hay una gran diferencia entre los punteros de función de estilo C y los métodos de C ++. Esto es lo que quiero decir:

typedef struct _myStruct {
    void (*myFunctionOne)();
    void(*myFunctionTwo)();
    void(*myFunctionThree)();
} myStruct;

El tamaño es 3 * 4 = 12 bytes.

typedef struct _emptyStruct {
} emptyStruct;

El tamaño es de 1 byte.

class myClass {
     void myMethodOne();
     void myMethodTwo();
     void myMethodThree();
};

El tamaño es de 1 byte, como si fuera una estructura vacía.

¿Por qué está vacío? Si los métodos de C ++ no son punteros a funciones, ¿cómo se implementan? ¿Cómo "sabe" la clase sobre sus métodos, si no tiene punteros? Esta pregunta en realidad no me desconcierta mucho, pero despierta mi curiosidad.

-3
Mihail Fufin 16 feb. 2018 a las 22:36

2 respuestas

La mejor respuesta

Las funciones miembro son funciones . Se implementan como funciones. No son datos y no se almacenan dentro de la estructura. Están simplemente declarados allí.

Si usted tiene

class myClass {
     void myMethodOne();
     void myMethodTwo();
     void myMethodThree();
};

Y luego otra clase

class myOtherClass {
     void myMethodOne();
     void myMethodFortyTwo();
};

Entonces myMethodOne de myClass y myOtherClass no entran en conflicto, porque en realidad tienen nombres diferentes: myClass::myMethodOne y myOtherClass::myMethodOne.

myClass myVar;
myVar.myMethodOne();

Este sabe llamar a myClass::myMethodOne y no a myOtherClass::myMethodOne debido al tipo de myVar. Es myClass, por lo que se llama al método de myClass.

Las funciones virtuales funcionan de manera diferente: se se almacenan en cada objeto, aunque generalmente de forma indirecta (a menudo como un puntero a un montón de punteros de funciones). De esta manera, el tamaño de cada objeto no crece a medida que agregamos más funciones virtuales.

2
n. 'pronouns' m. 16 feb. 2018 a las 20:21

En la estructura con punteros a funciones, cada puntero es una variable miembro . La clase C ++ no tiene ninguna variable miembro, está, como dices, vacía .

Las funciones miembro no son las mismas que las variables miembro.

4
Some programmer dude 16 feb. 2018 a las 19:38