Pytanie prywatnie lub publicznie dziedziczą z boost :: non_copyable?


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.


21
2018-04-13 19:13


pochodzenie


Zawsze to robię: class Foo: boost::noncopyable :) - UncleBens


Odpowiedzi:


boost::noncopyable nie deklaruje a virtual destruktor, tj. nie jest zaprojektowany jako podstawa publicznego łańcucha dziedziczenia. Zawsze z niego dziedzicz prywatnie.


24
2018-04-13 19:18





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.


3
2017-11-06 09:46





Według Zwiększ dokument

Jest przeznaczony do wykorzystania jako prywatna baza.


1
2018-03-20 09:25