Prévenir l'héritage de classe en C++

Récemment, un de mes ami m'a demandé comment faire pour empêcher l'héritage de classe en C++. Il voulait la compilation échoue.

Je pensais à elle et a trouvé 3 réponses. Vous ne savez pas lequel est le meilleur.

1) Constructeur(s)

class CBase
{

public:

 static CBase* CreateInstance() 
 { 
  CBase* b1 = new CBase();
  return b1;
 }

private:

 CBase() { }
 CBase(CBase3) { }
 CBase& operator=(CBase&) { }


};

2) à l'Aide de CSealed de la classe de base, privé ctor & héritage virtuel

class CSealed
{

private:

 CSealed() {
 }

 friend class CBase;
};


class CBase : virtual CSealed
{

public:

 CBase() {
 }

};

3) à l'Aide d'un CSealed de la classe de base, protégé ctor & héritage virtuel

class CSealed
{

protected:

 CSealed() {
 }

};

class CBase : virtual CSealed
{

public:

 CBase() {
 }

};

Toutes les méthodes ci-dessus, assurez-vous que CBase classe ne peut pas être héritée plus loin.
Ma Question est:

1) Qui est la meilleure méthode ? Toutes les autres méthodes disponibles ?

2) Méthode 2 & 3 ne fonctionnera pas à moins que le CSealed classe est héritée virutally. Pourquoi est-ce ? A-t-elle quelque chose à voir avec vdisp ptr ??

PS:

Le programme ci-dessus a été compilé dans MS compilateur C++ (Visual Studio).
référence : http://www.codeguru.com/forum/archive/index.php/t-321146.html

InformationsquelleAutor ring0 | 2010-02-02