[C++] ¿Cómo se define la clase sellada en C ++?


Answers

Hay dos formas, la simple barata y la correcta. Las dos respuestas de @Naveen y @Nawaz se refieren al correcto, que requiere la creación manual de una clase de sellador para cada clase que realmente desea sellar.

La forma no infalible, que se utiliza en las bibliotecas de adobe está utilizando una clase de plantilla para eso. El problema es que no puede declarar el argumento de la plantilla como un amigo, y eso significa que tendrá que pasar de la protected private a la protected menos segura:

template <typename T>
class sealer {
protected: sealer() {}
};
class sealed : virtual sealer<sealed> {};

Y puede automatizarlo con una macro (no recuerdo el sabor exacto de la macro en el código de Adobe):

#define seal( x ) virtual sealer<x>
class sealed : seal(sealed) 
{};

Ahora esto atrapará a las personas que equivocadamente intentan heredar sin saber que no deberían:

class derived : sealed {};
int main() {
   derived d;  // sealer<T>::sealer() is protected within this context
}

Pero no inhibirá a las personas que realmente desean derivar, ya que pueden obtener acceso al constructor derivando de la plantilla ellos mismos:

class derived : sealed, sealer<sealed> {};
int main() {
   derived d;
};

No estoy seguro de si esto cambiará en C ++ 0x, creo que recuerdo algunas discusiones sobre si una plantilla de clase podría ser amistosa con uno de sus argumentos, pero en una búsqueda superficial a través del borrador realmente no puedo decir. Si eso fue permitido, entonces esta sería una solución genérica bien:

template <typename T>
class sealer {
   sealer() {}
   friend class T; // Incorrect in C++03
};
Question

Cómo detener la clase para que sea heredada por otra clase.




El siguiente código muestra cómo definir una clase sellada en VS 2010.

class A sealed
{
    //here goes the class code
};

class B : public A
{
};

Ahora B: no puede heredar de A ya que ha sido declarado como 'sellado'. También se puede encontrar una explicación detallada acerca de la palabra clave sellada aquí http://msdn.microsoft.com/en-us/library/0w2w91tf.aspx




No puedes. C ++ no es Java o C #. Y también no tiene sentido, nunca, en mi humilde opinión.