像NonCopyable和NonMovable這樣的接口是否提供虛擬析構函數,並且聲明受保護的析構函數?NonCopyable和NonMovable等接口是否應該提供虛擬析構函數?
我無法想象任何人想要將對象存儲爲NonCopyable/NonMovable,並以這種多態方式使用它們。
像NonCopyable和NonMovable這樣的接口是否提供虛擬析構函數,並且聲明受保護的析構函數?NonCopyable和NonMovable等接口是否應該提供虛擬析構函數?
我無法想象任何人想要將對象存儲爲NonCopyable/NonMovable,並以這種多態方式使用它們。
用C++ 11繼承,你可以刪除構造函數和析構函數,使許多不可複製/不可移動成語過時:
YourClass() = delete; /*deletion of default constructor*/
YourClass(const YourClass&) = delete; /*deletion of copy constructor*/
~YourClass() = delete; /*deletion of the destructor of YourClass*/
等你如果任何代碼需要這些,將會導致編譯時失敗。
沒有不可複製的基礎不需要虛擬析構函數。但是,延伸這種非可複製類的類可能需要虛擬析構函數。
如果您正在使用升壓,你可以從noncopyable.hpp
這更像是一個問題,當我擁有自己的NonCopyable/NonMovable時該怎麼做。我應該提供一個虛擬析構函數,我猜不。 – NFRCR
虛擬析構函數在將對象存儲在基類的指針指向的位置時非常有用。在這裏,除非你使用base(非可複製的參考),否則沒有必要。所以我沒有看到需要。 –
性狀NonCopyable和NonMovable彼此正交,並與多態使用。
那麼,爲什麼不應該有人想混合搭配?
無論如何,避免這個問題的正確方法是聲明那些受到保護的類的析構函數,並且只將它們繼承爲私有的。尼爾柯克是對的。另外,從C++ 11開始,您可以顯式聲明任何要刪除的函數,這是首選方法。
你可以從它們繼承protected/private來避免這個問題嗎? –