【43】學習處理模版化基類內的名稱

Andy Niu發表於2014-01-10

1、考慮下面的場景,有個類模版template<typename T> Box{}; 內部有個方法XXX,現在子類template<typename T> class BigBox:public Box<T>{},BigBox內部使用方法XXX,考慮出現什麼問題?

2、首先一點,類模版產生出來的類之間,沒有關係。也就是Box<Book> 與Box<Dog>沒有關係。通過指定模版實參,可以產生不同的模板類,也可以全特化一個類,如下:

  template <>

  class Box<Cat>{...},這種情況下,就不再例項化模版類了,Box<Cat>可以宣告自己的介面,可能就沒有了XXX。那麼,問題出現了,BigBox繼承Box<T>,但是父類Box<T>可能有介面XXX,也可能沒有介面XXX,編譯器傻眼了。那麼還要不要繼承父類Box<T>的XXX方法呢?因為不確定一定有,所以不繼承,導致上面的情況編譯失敗。

3、怎麼解決?

  解決辦法很簡單,就是明確說,我要繼承父類Box<T>的方法。

  a、使用this->XXX();

  b、使用using Box<T>::XXX;

  c、使用Box<T>::XXX();

  第三種辦法不好,因為會關閉virtual繫結行為。

相關文章