tengo este código:¿Se permite que un objeto cambie legalmente su tipo durante su vigencia en C++?
class Class {
public:
virtual void first() {};
virtual void second() {};
};
Class* object = new Class();
object->first();
object->second();
delete object;
que compilar con Visual C++ 10 con/O2 y tener esta desmontaje:
282: Class* object = new Class();
00403953 push 4
00403955 call dword ptr [__imp_operator new (4050BCh)]
0040395B add esp,4
0040395E test eax,eax
00403960 je wmain+1Ch (40396Ch)
00403962 mov dword ptr [eax],offset Class::`vftable' (4056A4h)
00403968 mov esi,eax
0040396A jmp wmain+1Eh (40396Eh)
0040396C xor esi,esi
283: object->first();
0040396E mov eax,dword ptr [esi]
00403970 mov edx,dword ptr [eax]
00403972 mov ecx,esi
00403974 call edx
284: object->second();
00403976 mov eax,dword ptr [esi]
00403978 mov edx,dword ptr [eax+4]
0040397B mov ecx,esi
0040397D call edx
285: delete object;
0040397F push esi
00403980 call dword ptr [__imp_operator delete (405138h)]
Tenga en cuenta que en 00403968
la dirección del inicio de objetos (donde vptr
es almacenado) se copia en el registro esi
. Luego, al 0040396E
esta dirección se usa para recuperar el vptr
y el valor vptr
se usa para recuperar la dirección de first()
. Luego, al 00403976
, se recupera el vptr
y se usa para recuperar la dirección de second()
.
¿Por qué se recupera vptr dos veces? ¿Podría el objeto posible tener su vptr
cambiado entre llamadas o es simplemente una anulación de la privación?
Weird. Pensé que todo debería ser un no-op. Es probable que sea una excepción, si se mira dentro de las funciones podría haber visto que ninguno de ellos cambia 'esi'. –