Recientemente, uno de mis amigos me preguntó cómo evitar la herencia de clases en C++. Él quería que la compilación fallara.Prevenir la herencia de clases en C++
Lo estaba pensando y encontré 3 respuestas. No estoy seguro cuál es el mejor.
1) Constructor privada (s)
class CBase
{
public:
static CBase* CreateInstance()
{
CBase* b1 = new CBase();
return b1;
}
private:
CBase() { }
CBase(CBase3) { }
CBase& operator=(CBase&) { }
};
2) Uso de clase base CSealed, ctor privado & herencia virtual
class CSealed
{
private:
CSealed() {
}
friend class CBase;
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
3) El uso de una clase base CSealed, ctor protegido & herencia virtual
class CSealed
{
protected:
CSealed() {
}
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
Todos los métodos anteriores aseguran que la clase CBase no se puede heredar más. Mi pregunta es:
1) ¿Cuál es el mejor método? ¿Hay otros métodos disponibles?
2) El método 2 & 3 no funcionará a menos que la clase CSealed se herede virutalmente. Porqué es eso ? ¿Tiene algo que ver con vdisp ptr?
PS:
El programa anterior fue compilado en MS compilador de C++ (Visual Studio). referencia: http://www.codeguru.com/forum/archive/index.php/t-321146.html
Agregar una macro a la mezcla no hace de esto una solución nueva. –