在我的舊文中,曾經提到在 C++ 中實現 Java 的 final 功能,但每次都要寫一個基類比較麻煩,今次用模板把它加強。
1 template<class T>
2 class final{
3 friend T;
4 private:
5 final(){};
6 };
7
8 class MyTest : public virtual final<MyTest>{
9 public:
10 MyTest(){};
11 };
這樣以后就可以直接繼承模板類 final<T>,而不用每次都寫一個類。
在這里順便說一下,為什么一定要虛繼承,假設我們有
1 class test : public MyTest{};
如果上面不是虛繼承,那么 final 類的構造函數由 MyTest 的構造函數負責調用,因為是友元類,則調用成功,無法阻止 test 實例化。而一旦聲明為虛繼承,MyTest 不再負責調用 final 的構造函數,而由 test 來調用,那么因為不是友元類,實例化將失敗,編譯出錯,提示不能訪問私有的構造函數。