Estaba pasando por un article por Don Clugston en Codeproject. Es un hermoso artículo y es bastante famoso. En el siguiente fragmento de código, he encontrado una noción particular muy difícil de comprender:Punteros de función
class A {
public:
virtual int Afunc() { return 2; };
};
class B {
public:
int Bfunc() { return 3; };
};
// C is a single inheritance class, derives only from A
class C: public A {
public:
int Cfunc() { return 4; };
};
// D uses multiple inheritance
class D: public A, public B {
public:
int Dfunc() { return 5; };
};
El fragmento es seguido por el siguiente párrafo:
Supongamos que crea un puntero de función miembro de la clase C. En este ejemplo , Afunc y Cfunc son funciones miembro de C, por lo que nuestro puntero a la función puede señalar a Afunc o Cfunc. Pero Afunc necesita un puntero que apunta a C :: A (que llamaré Athis), mientras Cfunc necesita un puntero que apunta a C (que llamaré Cthis). Los escritores de compiladores lidian con esta situación por un truco: aseguran que A se almacena físicamente al inicio de C. Esto significa que Athis == Cthis. Solo tenemos uno de qué preocuparse, y todo está bien con el mundo.
Lo único y lo que quiero entender es la línea en negrita y en inglés en el párrafo anterior.
no comprendo totalmente Afunc necesita un puntero a C :: Un mientras Cfunc necesita un puntero a C es muy natural.
Cualquier ayuda sería apreciada.
¿Podría volver a formular la última oración? – msiyer
@msiyer He intentado agregar más información, con suerte esto es un poco más claro. –
Esta es una gran explicación. Soy un graduado de Ingeniería Mecánica y, por lo tanto, no he tomado ningún curso de CS. Estoy, ahora, haciéndolo solo. Aprender todo eso es necesario para tener una base sólida en el diseño y construcción de compiladores. Con respuestas como estas, uno realmente no puede perderse mucho la educación formal de CS. Gracias Konrad. – msiyer