CComObject, CComAggObject a CComPolyObject
Šablona třídy CComObject, CComAggObject, a CComPolyObject jsou vždy nejvíce odvozené třídy řetězce dědičnosti.Je jejich odpovědnosti za zpracování všech metod v IUnknown: QueryInterface , AddRef , a vydání.Kromě toho CComAggObject a CComPolyObject (při použití souhrnných objektů) poskytnout zvláštní referenční počítání a QueryInterface sémantiku pro vnitřní neznámé.
Zda CComObject , CComAggObject , nebo CComPolyObject je použit, závisí na zda prohlásit některé (nebo žádné) následující makra:
Makro |
Účinek |
---|---|
DECLARE_NOT_AGGREGATABLE |
Vždy používá CComObject . |
DECLARE_AGGREGATABLE |
Používá CComAggObject Pokud objekt shromažďovány a CComObject Pokud není.CComCoClassToto makro obsahuje tak pokud žádný z DECLARE_ * _AGGREGATABLE makra jsou deklarovány ve své třídě, bude výchozí. |
DECLARE_ONLY_AGGREGATABLE |
Vždy používá CComAggObject .Vrátí chybu, pokud objekt není agregované. |
DECLARE_POLY_AGGREGATABLE |
ATL vytvoří instanci CComPolyObject <CYourClass> při IClassFactory::CreateInstance se nazývá.Během vytváření se kontroluje hodnotu vnější neznámý.Pokud je NULL, IUnknown je implementováno pro objekt nonaggregated.Pokud není vnější neznámý NULL, IUnknown je implementováno pro agregovaný objekt. |
Výhodou použití CComAggObject a CComObject je, že provádění IUnknown je optimalizován pro druh vytvářený objekt.Například nonaggregated objekt vyžaduje počet odkazů, zatímco počet odkazů pro neznámé vnitřní a vnější neznámý ukazatel musí agregovaný objekt.
Výhodou použití CComPolyObject je zabránit obě CComAggObject a CComObject v modulu pro zpracování případů souhrnné a nonaggregated.Jeden CComPolyObject objektu zpracovává obou případech.To znamená, že existují pouze jednu kopii virtuální tabulka a jednu kopii funkce v modulu.Pokud vaše virtuální tabulka je velký, to podstatně zmenšit velikost poštovní modul.Však pokud vaše virtuální tabulka je malá, pomocí CComPolyObject může vést k poněkud větší velikost modulu protože není optimalizována pro souhrnné nebo nonaggregated objektu, jako jsou CComAggObject a CComObject .