Récemment, un de mes amis m'a demandé comment empêcher l'héritage des classes en C++. Il voulait que la compilation échoue.
J'y ai réfléchi et j'ai trouvé 3 réponses. Je ne suis pas sûr de savoir laquelle est la meilleure.
1) Constructeur(s) privé(s)
class CBase
{
public:
static CBase* CreateInstance()
{
CBase* b1 = new CBase();
return b1;
}
private:
CBase() { }
CBase(CBase3) { }
CBase& operator=(CBase&) { }
};
2) Utilisation de CSealed
classe de base, ctor privé & héritage virtuel
class CSealed
{
private:
CSealed() {
}
friend class CBase;
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
3) Utilisation d'un CSealed
classe de base, ctor protégé & héritage virtuel
class CSealed
{
protected:
CSealed() {
}
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
Toutes les méthodes ci-dessus permettent de s'assurer que CBase
ne peut plus être héritée. Ma question est la suivante :
-
Quelle est la meilleure méthode ? Existe-t-il d'autres méthodes ?
-
Les méthodes 2 et 3 ne fonctionneront pas si le
CSealed
est héritée virutalement. Comment cela se fait-il ? Est-ce que cela a quelque chose à voir avec le ptr vdisp ?
PS :
Le programme ci-dessus a été compilé dans le compilateur MS C++ (Visual Studio). référence : http://www.codeguru.com/forum/archive/index.php/t-321146.html