Implementación de CComObject, CComAggObject y CComPolyObject

Las clases de plantilla, CComObject, CComAggObjecty CComPolyObject son siempre las clases más derivadas de la cadena de herencia. Es su responsabilidad para manejar todos los métodos de IUnknown: QueryInterface, AddRefy Release. Además, CComAggObject y CComPolyObject (cuando se usa para objetos agregados) proporcionan el recuento de referencias especiales y la semántica de QueryInterface requerido para el interior desconocido.

Si se utiliza CComObject, CComAggObjecto CComPolyObject depende si se declara la macro DECLARE_POLY_AGGREGATABLE y si su objeto es ser agregado:

La ventaja de utilizar CComAggObject y CComObject es que la aplicación de IUnknown está optimizada para el tipo de objeto que se está creando. Por ejemplo, un objeto nonaggregated sólo necesita un número de referencia, mientras que un objeto agregado necesita un contador de referencia para el desconocido interior y un puntero a lo desconocido exterior.

La ventaja de utilizar CComPolyObject es que se evita tener CComAggObject y CComObject en el módulo para manejar los casos agregados y nonaggregated. Un único objeto CComPolyObject maneja ambos casos. Esto significa que existen solamente una copia de la vtable y una copia de las funciones en el módulo. Si tu vtable es grande, esto puede reducir considerablemente el tamaño del módulo. Sin embargo, si tu vtable es pequeño, utilizando CComPolyObject puede resultar en un tamaño ligeramente mayor de módulo porque no está optimizado para un objeto agregado o nonaggregated, como son CComAggObject y CComObject.

La macro DECLARE_POLY_AGGREGATABLE se agrega automáticamente a la definición de clase por el Asistente para objetos ATL cuando se crea un control total o el control de Internet Explorer. Para obtener más información sobre el asistente, vea crear un proyecto ATL.

Index