Comparação de alças: classes vazias vs. classes indefinidas vs.

Da MicrosoftGDI + define muitas classes vazias a serem tratadas como identificadores internamente. Por exemplo, (fonteGdiPlusGpStubs.h)

//Approach 1

class GpGraphics {};

class GpBrush {};
class GpTexture : public GpBrush {};
class GpSolidFill : public GpBrush {};
class GpLineGradient : public GpBrush {};
class GpPathGradient : public GpBrush {};
class GpHatch : public GpBrush {};

class GpPen {};
class GpCustomLineCap {};

Existem outras duas maneiras de definir identificadores. Eles estão,

//Approach 2
class BOOK;  //no need to define it!
typedef BOOK *PBOOK;
typedef PBOOK HBOOK; //handle to be used internally

//Approach 3
typedef void* PVOID;
typedef PVOID HBOOK; //handle to be used internally

Eu só quero saber as vantagens e desvantagens de cada uma dessas abordagens.

Uma vantagem da abordagem da Microsoft é que eles podem definirseguro hierarquia de alças usando classes vazias, o que (eu acho) não é possível com as outras duas abordagens, apesar de eu me perguntar quais vantagens essa hierarquia traria para a implementação? Enfim, o que mais?

EDITAR:

Uma vantagem da segunda abordagem (ou seja, o uso de classes incompletas) é que podemos impedir que os clientes desreferenciem os identificadores (ou seja, essa abordagem parece suportar fortemente o encapsulamento, suponho). O código nem seria compilado se alguém tentasse desreferenciar identificadores. O quê mais?

A mesma vantagem que se tem com a terceira abordagem também, é que você não pode desreferenciar as alças.

questionAnswers(3)

yourAnswerToTheQuestion