2010-06-02 7 views
4

J'utilise un code qui traite un tableau d'objets dérivés en tant que tableau d'objets de base. La taille des deux objets est la même. Je me demande:Utilisation d'un tableau d'objets dérivés en tant que tableau d'objets de base lorsque les tailles sont les mêmes (CComVariant/VARIANT)

  • Est-ce sûr dans la pratique, en gardant à l'esprit que le code ne sera jamais compilé sur les compilateurs Microsoft?

Voici mon exemple:

BOOST_STATIC_ASSERT(sizeof(VARIANT)==sizeof(CComVariant)); 

//auto_array deletes[] the pointer if detach() isn't called at the end of scope 
auto_array<CComVariant> buffer(new CComVariant[bufferSize]); 

//...Code that sets the value of each element... 

//This takes a range specified as two VARIANT* - the AtlFlagTakeOwnership option 
//causes delete[] to be called on the array when the object pEnum referes to 
//is released. 
pEnum->Init(buffer.ptr,buffer.ptr+bufferSize,0,AtlFlagTakeOwnership); 
buffer.detach(); 

Répondre

1

Oui, CComVariant a été conçu pour être un substitut direct pour VARIANT. Il dérive de la structure de variante et n'ajoute aucun membre virtuel ni aucun champ (et aucun destructeur virtuel) pour s'assurer que la disposition de la mémoire est la même. Beaucoup de petites classes auxiliaires comme ça dans ATL/MFC, comme CRect, CPoint etc.