2008年12月13日 星期六

base class的virtual destructor的補充

我是習慣讓base class有virtual destructor,因為大部分我都是需要做多型刪除(polymorphic deletion)的,主要觀念是從C++編程規範來的,我節錄一下書裡編號50的準則


令base class的解構式為public virtual或protected nonvirtual
摘要(Summary):
刪還是不刪,真讓人頭疼:如果允許透過pointer to Base來刪除物件,那麼Base的解構式必須是public virtual函式。否則它應該是protected nonvirtual函式。


意思指的是


客戶要不就應該透過pointer to Base進行多型刪除(polymorphic deletion),要不就不該刪除。


如果允許多型刪除的話,那解構子就應該是public且為virtual function。
反之若不希望客戶進行多型刪除的話,那解構子就設計為nonpublic且nonvirtual。


上述這種判斷方式會比「將所有base class都固定加入virtual dtor」來得好。 :)


例外狀況


你可以讓解構式是public且nonvirtual,但必須在文件中清楚說明:B的更深層衍生物件(further-derived objects)絕對不能被多型使用(當作B)。std::unary_function就是這樣。





Notes:
1. base class指的是那些"準備要被繼承的底層類別"。

2. 並不是要將所有class都加入virtual dtor,而是如果該class可能會被繼承且需要支援多型刪除的話,那就加入virtual dtor,反之,如果該class根本不會(或是不希望)被繼承的話,那就不需要加入virtual dtor。

3. virtual dtor常常可以用來識別class能否被繼承。

4. 至於像unary_function這種class,除了文件註明外,解構子可以考慮設計為protected。 (這個書上也有提到)

Reference:
1: C++編程規範 - 101個準則、指導方針,和最佳實踐 - 侯捷/陳碩 譯
2.
Re: ‘dynamic_cast’ : ‘A’ is not a polymorphic type - http://fsfoundry.org/codefreak/
3.
http://legnaleurc.blogspot.com/2008/11/2.html
4.
'dynamic_cast' : 'A' is not a polymorphic type


因為感覺這一篇寫得不夠完整且完整表達我的想法,因此我有稍微修改過。

沒有留言:

LinkWithin

Related Posts with Thumbnails