CPP Templates 之 類模板的繼承

來源:互聯網
上載者:User
類模板的繼承

類模板可以繼承也可以被繼承。

1.在一個類模板中,一個非依賴型基類是指:無須知道模板實參就可以完全確定類型的
基類。

例如:

template<typename X>
class Base{
public:
    int basefield;
    typedef int T;
};

class D1:public Base<Base<void> >{//實際上不是模板
    public:
    void f(){basefield = 3; }
};

template<typename T>
class D2:public Base<double>{
 public:
    void f() { basefield = 7; }//正常訪問繼承成員
    T strange;//T是Base<double>::T,而不是模板參數
};

注意事項:對於模板中的非依賴類型而言,如果在他的衍生類別中尋找一個非受限名稱,
那就會先尋找這個非依賴型基類,然後才會尋找模板參數列表。

2.非依賴性名稱不會在依賴基類中尋找

template<typename X>
class Base{
public:
    int basefield;
    typedef int T;
};

template <typename T>
class DD:Base<T>{
public:
    void f(){
        basefield = 0;//problem
    }

};

template<>
class Base<bool>{
public:
    enum { basefield = 42 };//tricky
};

void g(DD<bool>& d){
    d.f();//opps
}

//修改方案一
template <typename T>
class DD1:Base<T>{
public:
    void f(){
        this->basefield=0;//尋找被延遲了
    }

};

//修改方案二
template <typename T>
class DD2:Base<T>{
public:
    void f(){
        Base<T>::basefield=0;//尋找被延遲了
    }

};

如果使用修改方案二,如果原來的非受限非依賴型名稱是被用於虛函數調用的話,
那麼引入依賴性的限定的話,那麼這種引入依賴性的限定將會近之虛函數調用,
從而也會改變程式的含義,當遇到第二種情況不適合的情況,可以採用方案一

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.