令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
因為感覺這一篇寫得不夠完整且完整表達我的想法,因此我有稍微修改過。
沒有留言:
張貼留言