雖然在編寫測試代碼時發現this query的答案,但我知道私有/受保護的繼承會改變從各種類接收異常的方式,這非常令人驚訝。爲了找到答案,我提到了前面的論壇問題,我遇到了this similar question。爲什麼繼承影響異常處理?
對我來說,使用protected
繼承基類有virtual
方法是非常明顯的。拋開標準,我想知道爲什麼在虛擬方法調用不是時,C++異常處理受到繼承限制? 下面的代碼片段解釋它:
struct Base { virtual void printError() = 0; };
class Derived : protected Base { void printError() { } };
int main()
{
try {
throw new Derived;
}
catch(Base *p) { p->printError(); } // Ideal; but not invoked
catch(void *p) { ((Base*)p)->printError(); } // Ugly; but only way to invoke
}
編輯: 如果我們考慮到隱私方面作爲一個答案;公認。但是爲什麼它僅適用於接收基指針的catch()
,而它不適用於接收基指針的函數?
+1好問題。 – Nawaz 2011-04-09 08:49:10
小調,你不必在'throw'語句中使用'new',你只會冒這樣的風險來引入內存泄漏。而是使用'throw Derived();'並通過引用'Base&'捕獲。另外,如果基類有虛方法,爲什麼有人會使用'protected'繼承,我認爲你在這裏出錯了......最後,異常類通常應該從'std :: exception'繼承,並且重載'char const * what()const'。 – 2011-04-09 09:47:21
@Matthieu,謝謝,但上面的代碼只是爲了演示的目的。在這種情況下,通過引用捕獲是不可能的,因爲你無法捕獲'void&';不過,我也更喜歡通過引用捕捉。根據我的設計,我希望Interface(這裏是''Base')類方法(尤其是虛擬的)不應該被其他名字空間中的任何子類調用。 – iammilind 2011-04-09 11:28:20