Pregunta

Estoy tratando de entender este código de ejemplo respecto Browser Helper Objects.

En el interior, los implementos de autor una sola clase que expone varias interfaces (IObjectWithSite, IDispatch).

Sus QueryInterface ejerce funciones de los siguientes:

if(riid == IID_IUnknown) *ppv = static_cast<BHO*>(this);
else if(riid == IID_IObjectWithSite) *ppv = static_cast<IObjectWithSite*>(this);
else if (riid == IID_IDispatch) *ppv = static_cast<IDispatch*>(this);

He aprendido que desde una perspectiva de C, punteros de interfaz son sólo punteros a vtables. Por lo tanto, considero que significa que C ++ es capaz de devolver la viable de cualquier interfaz implementada utilizando static_cast.

¿Esto quiere decir que una clase construido de esta manera tiene un montón de vtables en la memoria (IObjectWithSite, IDispatch, etc)? Lo que hace C ++ ver con los conflictos de nombres en las diferentes interfaces (cada uno tiene una función QueryInterface, AddRef y liberación), puedo aplicar diferentes métodos para cada uno de estos?

¿Fue útil?

Solución

Sí, hay múltiples v-tablas, una para cada interfaz heredada. El static_cast <> devuelve. El compilador se asegura de que los métodos comunes en las interfaces heredadas son compartidos, que se llena cada ranura v-mesa con el puntero a la misma función. Por lo que sólo necesita una implementación de AddRef, lanzamiento, QueryInterface. Justo lo que quieres. Nada de esto es un accidente.

Esto es sólo alguna vez un problema cuando un coclase implementos de múltiples interfaces con el mismo método que no quieren dar la misma aplicación. El método IConnectionPoint :: Advise () es un ejemplo notorio. ¿O era DAdvise ()? Por desgracia, no me acuerdo de lo que se enfrentaron con y cómo se resolvió, que estaba cubierto por ATL Internos. Libro muy bueno por cierto.

Otros consejos

En la herencia múltiple, múltiples vtables están dispuestos en secuencia como formato siguiente si se les da puntero this (que seleccione primero byte, 01)

[01] [02] [03] [04] [05] [06] [07] [08] [09] [10] [11] [12]
[Ptr de VTableA] [Ptr de VTableB] [Ptr de VTableC]

En C ++, se generará solamente 1 aplicación por prototipo de función en el escenario de interfaz múltiple. Sin embargo para el escenario de la herencia normal, podría haber superclase implementación y niños que anula la función tendrá sus vtables apuntando al contenido diferente a los padres pre-definido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top