creo que desde el punto de vista más alto que debe ser public
herencia. Las razones para hacerlo private
son puramente técnicas.
¿Por qué? Porque si un tipo es copiable o no (y esto se muestra heredando de boost::noncopyable
) es parte de interfaz pública. Por ejemplo si la herencia sería public
que sería capaz de comprobar (mediante la "programación meta") si el tipo se deriva de boost::noncopyable
y entonces la razón acerca de si es o no copiable.
Nikolai N Fetissov in his answer to this question señala que boost::noncopyable
no tiene virtual
destructor y por tanto no debe usarse como clase public
base. Mientras que un argumento válido, en general, creo que es tan poco probable que alguna vez alguien podría tratar de usar (y delete
en particular) un objeto mediante un puntero a boost::noncopyable
que hace que el argumento (en este caso particular) puramente académico.
Vamos! Si alguien está tan inclinado a utilizar un código incorrecto que usa delete
en un puntero a boost::noncopyable
, entonces no hay forma de estar seguro. Claro que puede hacerlo un poco más difícil, pero un programador tan determinado encontrará de alguna manera otra manera de utilizar el código de todos modos.
También parece que en C++ 11 boost::noncopyable
podría resolver ese problema declarando default
protected
destructor:
protected:
~noncopyable() = default;
De esta manera no debería haber ningún costo adicional de declarar destructor (ya lo hicimos default
), mientras estamos protegidos de delete
en un puntero a boost::noncopyable
.
Por otro lado, sin embargo, tampoco parece probable que alguien esté dispuesto a verificar si un tipo se puede copiar verificando la herencia de boost::noncopyable
. Principalmente porque no proporciona una respuesta completa. El hecho de que un tipo no se deriva de boost::noncopyable
no significa que sea copiable.
Tenga en cuenta también que Boost.Noncopyable docs sugieren el uso de la herencia private
.
que siempre hago: 'clase Foo: impulsar :: :) noncopyable' – UncleBens