multiples multiple herencias herencia ejemplo derivadas derivacion clases abstractas c++ mfc multiple-inheritance

herencias - herencia multiple ejemplo c++



¿Qué problemas podría causar la advertencia de C4407? (2)

Recibí algunas advertencias al usar interfaces virtuales puras en algunos objetos derivados MFC CWnd través de herencia múltiple. Creo que es causado por la definición de los métodos que deben implementarse para el mapa de mensajes.

warning C4407: cast between different pointer to member representations, compiler may generate incorrect code

Eso suena como un poco más que una advertencia, más como algo que podría causar corrupción en el montón. Entonces, ¿hay alguna otra manera de hacer algo similar a lo anterior que no cause que las macros dinámicas de MFC se ahoguen más de lo normal?

class ISomeInterface { public: virtual LRESULT OnSomeRegisteredMessage(WPARAM wp, LPARAM lp) = 0; }; class CSomeCoolWnd : public CWnd, public ISomeInterface { public: LRESULT OnSomeRegisteredMessage(WPARAM wp, LPARAM lp); }; BEGIN_MESSAGE_MAP(CSomeCoolWnd , CWnd) ON_REGISTERED_MESSAGE(WM_USER_DEFINED, &CSomeCoolWnd::OnSomeRegisteredMessage) END_MESSAGE_MAP()

Lo único que se me ocurre es comentar los manejadores de mensajes de las interfaces y dejar comentarios diciéndole al consumidor que deberían implementarlos. Sin embargo, sería bueno hacer cumplir eso a través de un error de compilación en lugar de dejarlos usar una interfaz y obtener resultados inesperados en el tiempo de ejecución a partir de las cosas que faltan.


Intenta usar algo como esto:

class ISomeInterface { public: virtual LRESULT OnSomeRegisteredMessage(WPARAM wp, LPARAM lp) = 0; }; class CSomeCoolWnd : public CWnd, public ISomeInterface { public: LRESULT OnSomeRegisteredMessage(WPARAM wp, LPARAM lp); }; typedef void (CSomeCoolWnd::*FNMETHOD) (WPARAM, LPARAM); FNMETHOD method = &CSomeCoolWnd::OnSomeRegisteredMessage; BEGIN_MESSAGE_MAP(CSomeCoolWnd, CWnd) ON_REGISTERED_MESSAGE(WM_USER_DEFINED, method) END_MESSAGE_MAP()


Puede encontrar una descripción excelente de las diferentes representaciones de valores de puntero a miembro en el artículo Punteros de función de miembro y los Delegados de C ++ más rápidos posibles . Esencialmente, todos los diferentes tipos de herencia pueden requerir el uso de diferentes representaciones de puntero de función miembro. Esto es específico del compilador y el artículo habla sobre varios compiladores diferentes (hasta 2005 cuando se escribió el artículo).

Evidentemente, su uso de la herencia múltiple con funciones virtuales puede requerir una representación diferente de una función simple de puntero a miembro. Probablemente haya un elenco en algún lugar de ON_REGISTERED_MESSAGE() que no esté visible en el código que ha publicado.