CComPolyObject クラス

更新 : 2007 年 11 月

このクラスは、集約オブジェクトまたは非集約オブジェクトの IUnknown を実装します。

template<
   class contained 
>
class CComPolyObject : public IUnknown, public CComObjectRootEx
   < contained::_ThreadModel::ThreadModelNoCS >

パラメータ

  • contained
    作成したクラス。CComObjectRoot または CComObjectRootEx から派生させるか、作成したクラスでサポートする任意のインターフェイスから派生させます。

解説

CComPolyObject は集約オブジェクトと非集約オブジェクトの IUnknown を実装します。

CComPolyObject のインスタンスが作成される場合は、外側の IUnknown の値がチェックされます。値が NULL の場合、IUnknown は非集約オブジェクト用に実装されます。外側の IUnknownNULL でない場合、IUnknown は集約オブジェクト用に実装されます。

CComPolyObject を使うことの利点は、集約オブジェクトと非集約オブジェクトを扱う場合に、モジュール中に CComAggObjectCComObject の両方を持つ必要がないことです。CComPolyObject オブジェクトが 1 つあれば両方を扱うことができます。つまり、モジュール中には vtable のコピーと関数のコピーがそれぞれ 1 つだけ存在することになります。vtable のサイズが大きい場合は、これによってモジュール サイズを大幅に縮小できます。ただし、vtable のサイズが小さい場合は、CComPolyObject を使うとモジュール サイズが逆に大きくなってしまう可能性があります。これは、CComAggObjectCComObject とは異なり、CComPolyObject は集約オブジェクトや非集約オブジェクト用に最適化されていないためです。

オブジェクトのクラス定義に DECLARE_POLY_AGGREGATABLE マクロを指定すると、オブジェクトの作成に CComPolyObject が使用されます。ATL プロジェクト ウィザードを使用してフル コントロールまたは Internet Explorer コントロールを作成すると、DECLARE_POLY_AGGREGATABLE が自動的に宣言されます。

集約される場合は、CComPolyObject オブジェクトは、外側の IUnknown とは別に独自の IUnknown を持ち、独自の参照カウントを管理します。CComPolyObjectCComContainedObject を使って、外側の IUnknown に処理を代行させます。

集約の詳細については、「ATL COM オブジェクトの基本事項」を参照してください。

必要条件

ヘッダー : atlcom.h

参照

参照

CComObjectRootEx クラス

DECLARE_POLY_AGGREGATABLE

その他の技術情報

CComPolyObject のメンバ

ATL クラスの概要