Którą praktykę poleciłbyś i dlaczego?
class Foo : public boost::noncopyable {};
vs.
class Foo : private boost::noncopyable {};
Nie mogę sobie wyobrazić potrzeby użycia instancji Foo jako boost :: noncopyable, więc skłaniam się ku prywatnemu dziedziczeniu w tym przypadku.
boost::noncopyable
nie deklaruje a virtual
destruktor, tj. nie jest zaprojektowany jako podstawa publicznego łańcucha dziedziczenia. Zawsze z niego dziedzicz prywatnie.
Myślę, że z wyższego punktu widzenia powinno być public
dziedzictwo. Powody, by to zrobić private
są czysto techniczne.
Czemu? Bo czy typ jest kopiowalny, czy nie (i jest to pokazane przez dziedziczenie z boost::noncopyable
) jest częścią publiczny berło. Na przykład, gdyby dziedziczenie było public
byłbyś w stanie sprawdzić (używając "meta-programowania"), czy typ pochodzi od boost::noncopyable
a następnie uzasadnienie, czy jest ono kopiowalne czy nie.
Nikolai N Fetissov w jego odpowiedzi na to pytanie wskazuje na to boost::noncopyable
nie ma virtual
destruktor i tak nie powinno być używane jako public
klasa podstawowa. Chociaż ogólnie jest to słuszna argumentacja, wydaje mi się, że jest tak mało prawdopodobne, aby ktokolwiek próbował użyć (i delete
w szczególności) obiekt przez wskaźnik do boost::noncopyable
że czyni argument (w tym konkretnym przypadku) czysto akademickim.
Daj spokój! Jeśli ktoś jest tak skłonny do niewłaściwego użycia kodu, z którego korzysta delete
na wskaźniku do boost::noncopyable
wtedy nie ma sposobu, aby być bezpiecznym. Pewnie, że możesz zrobić to nieco trudniej, ale programista tak zdeterminowany znajdzie i tak inny sposób nadużywania kodu.
Również wydaje się, że w C ++ 11 boost::noncopyable
mógł rozwiązać ten problem, deklarując default
protected
burzyciel:
protected:
~noncopyable() = default;
W ten sposób nie powinno być żadnych dodatkowych kosztów deklarowania destruktora (od kiedy go wykonaliśmy) default
), podczas gdy jesteśmy chronieni delete
na wskaźniku do boost::noncopyable
.
Z drugiej strony wydaje się również mało prawdopodobne, że ktokolwiek będzie skłonny sprawdzić, czy dany typ można skopiować, sprawdzając dziedziczenie z boost::noncopyable
. Głównie dlatego, że nie zapewnia kompletnej odpowiedzi. Tylko dlatego, że typ nie pochodzi od boost::noncopyable
nie oznacza to, że można go kopiować.
Zauważ także, że Udoskonalone dokumenty sugerują użycie private
dziedzictwo.
Według Zwiększ dokument
Jest przeznaczony do wykorzystania jako prywatna baza.