簡體   English   中英

C ++模板和繼承

[英]C++ templates and inheritance

我可以這樣混合繼承和模板嗎?

template <class T> 
class AbstractType { // abstract
//....
}

template <class T> 
class Type1 : public AbstractType<T> {
//....
}

稍后,我可以像這樣使用這些類:

AbstractType<SomeClass>* var1 = new Type1<SomeClass>();

謝謝你的幫助。

是的你可以。 您可以將模板參數用於任何您想要的內容,並傳遞給包含的基本模板化類。

你可以,但它不會像你想象的那樣有用。 您可以像這樣定義結構:

#include <string>
#include <vector>
using namespace std;

template<typename Val>
class Base
{
public:
    virtual Val DoIt() const = 0;
};

template<typename Val>
class Derived : public Base<Val>
{
public:
    Derived(const Val& val) : val_(val) {};
    Val DoIt() const { return val_; }
protected:
    Val val_;
};

int main()
{
    Derived<string> sd("my string");
    string sd_val = sd.DoIt();

    Derived<float> fd(42.0f);
    float fd_val = fd.DoIt();
}

但是當你定義抽象基類型時,你經常會想要它們的集合,並且能夠通過基類指針調用以獲得多態行為。 如果您對基類進行模板化,那么您將無法執行此操作,因為模板參數的每個變體都將創建不同的類型。 Base<int>Base<string>完全不同,你不能只獲得指向任何一個的Base*

此代碼將無法編譯:

vector<Base*> my_objs;

如果類型與類定義兼容,則可以將任何類型與類模板一起使用

例如

template<class T> struct S{
   T mt;
};

這樣的結構可以實例化為T = int,T = double,但不是T = void。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM