Listing 1: COM-like architecture in C++

enum InterfaceTypes { IGROUP1, IGROUP2,
    IGROUP3, INTERFACE_NOT_IMPLEMENTED,
    ALLS_WELL };

//Note that the syntax and function names
//are only approximations of COM and serve
//only as an example of how COM might appear
//in a C++ Class. We will see "real COM" later

class InterfaceToGroupOne
{
public:
  InterfaceToGroupOne(){};
  void GroupOneFunc1()
    {cout<<"Group 1 func1"<<endl;}
  void GroupOneFunc2()
    {cout<<"Group 1 func2"<<endl;}
};

class InterfaceToGroupTwo
{
public:
  InterfaceToGroupTwo(){};
  void GroupTwoFunc1()
    {cout<<"Group 2 func1"<<endl;}
  void GroupTwoFunc2()
    {cout<<"Group 2 func2"<<endl;}
};

class COMObject
{
private:
  InterfaceToGroupOne m_I1;
  InterfaceToGroupTwo m_I2;

public:
  int GetInterface(enum InterfaceTypes type,
                   void *p)
  {
    if(type==IGROUP1)
    { p=&m_I1;
      return ALLS_WELL;
    }
    else
    {
      if (type==IGROUP2)
      {
        p=&m_I2;
        return ALLS_WELL;
      }
      else
      {
        p=NULL;
        return INTERFACE_NOT_IMPLEMENTED;
      }
    }
  };

void main()
{
  COMObject k;
  InterfaceToGroupTwo * i2;
  InterfaceToGroupOne *i1;

  k.GetInterface(IGROUP2, i2);
  k.GetInterface(IGROUP1, i1);

  i2->GroupTwoFunc1();
  i1->GroupOneFunc1();
}

OUTPUT:

Group 2 func1
Group 1 func1

//End of File