2011-04-13 6 views
21

¿Qué práctica recomendaría y por qué?privada o públicamente hereda de boost :: non_copyable?

class Foo : public boost::noncopyable {}; 

vs

class Foo : private boost::noncopyable {}; 

No me puedo imaginar tener que utilizar una instancia de Foo como un impulso :: noncopyable, así que me estoy inclinando hacia la herencia privada en este caso.

+2

que siempre hago: 'clase Foo: impulsar :: :) noncopyable' – UncleBens

Respuesta

24

boost::noncopyable no declara un destructor virtual, es decir, no está diseñado para ser la base de la cadena de herencia pública. Siempre herede de él privadamente.

3

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 defaultprotected 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.

1

Según la Boost document

está destinado a ser utilizado como una base privada.

Cuestiones relacionadas