x64 visual vc90 sp1 secure msvc microsoft includes descargar and c++ oop

c++ - visual - microsoft.vc90.mfc x86



Diseño de tabla virtual C++ de MI(herencia múltiple) (2)

Mira el siguiente código de C ++

class Base1 { public: Base1(); virtual ~Base1(); virtual void speakClearly(); virtual Base1 *clone() const; protected: float data_Base1; }; class Base2 { public: Base2(); virtual ~Base2(); virtual void mumble(); virtual Base2 *clone() const; protected: float data_Base2; }; class Derived : public Base1, public Base2 { public: Derived(); virtual ~Derived(); virtual Derived *clone() const; protected: float data_Derived; };

El 《Dentro del Modelo de Objeto C ++》 4.2 dice que el diseño de la tabla virtual de las clases Base1, Base2 y Derivadas es así:

Mi pregunta es :

La tabla virtual del subobjeto Base1 de la clase Derivada contiene Base2::mumble mumble. ¿Por qué? Sé que la clase Derivada compartió esta tabla virtual con la Base1, así que creo que la función de Base2 no debería aparecer aquí. ¿Alguien podría decirme por qué? Gracias.


Bueno, en primer lugar, les recordaré a todos que el diseño de la solución para implementar el polimorfismo es una decisión ABI fuera de la Norma. Por ejemplo, MSVC y Itanium ABI (seguidos de gcc, clang, icc, ...) tienen diferentes formas de implementar esto.

Con eso fuera del camino, creo que esta es una optimización para la búsqueda.

Siempre que tenga un objeto Derived (o uno de sus descendientes) y busque el miembro mumble , no es necesario que descubra realmente el subobjeto Base2 sino que puede actuar directamente desde el subobjeto Base1 (cuya dirección coincide con el subobjeto Derived , por lo que no hay aritmética involucrada ).


En el tiempo de ejecución cuando se obtiene:

Base2 b2; Base1* b1_ptr = (Base1*)&b2; b1_ptr->mumble(); // will call Base2::mumble(), this is the reason.

¡Entonces se debe invocar Base2 :: mumble ()! Tenga cuidado de que mumble () sea el ÚNICO método virtual que se anuló en la jerarquía. (Incluso, puedes pensar que clone () también está anulado, pero que devuelve un tipo diferente entre clases, entonces es otra firma).