2015-10-31 81 views
0

已解決!從非模板類派生的模板類:訪問派生類的通用變量

我想使用模板創建一個不同類型對象的數組。 因此,我有一個非模板類(Base),以及一個從Base類派生的模板類。

我想知道的是如何訪問派生類的泛型值(T val)?

class Base{ 
public: 

    // a function returns T val, it will be implemented in Derived class 

    // EDIT : virtual function here 

}; 

template<class T> 
class Derived: public Base { 

public: 
    T val; 

    Derived(T x) { 
     val = x; 
    } 

    // implementation.. it returns val 

    // EDIT : Implementation of virtual function 
}; 

解決方案:的dynamic_cast,需要注意的是基類至少應該有一個虛函數。

Base *p[2]; 
p[0] = new Derived<int>(24); 
p[1] = new Derived<double>(82.56); 

int a = dynamic_cast<Derived<int>*>(p[0])->val;  // casts p[0] to Derived<int>* 
double b = dynamic_cast<Derived<double>*>(p[1])->val; // casts p[1] to Derived<double>* 

cout << a << endl; 
cout << b << endl; 
+0

爲什麼不能讓基類模板化呢? – basav

+0

你不能從基類中獲取派生類成員...所以,如果它接受參數,可以將它傳遞給基類 – basav

+0

我試圖創建一個包含不同類型對象的數組。我試圖創建一個'模板類'的數組,但我不得不這樣指定它的類型: 派生 p [10]。但數組應該容納任何類型的對象 – luo

回答

0

上次我檢查,你不能從基類(非虛擬)獲得派生類成員。

你可以用這種方式修改你的代碼,因爲你正在使用模板。類型和值在構造時傳遞給基類,然後你可以使用它。

template<typename T> 
class Base { 
    T ini; 
public: 
    Base(T arg){ini = arg;} 
    T ret(){return ini;} 
}; 

template<class T> 
class Derived: public Base<T> { 

public: 
    T val; 

    Derived(T x) : Base<T>(x) { 
     //Base(x); 
     val = x; 
    } 

    // implementation.. it returns val 
}; 

然後,您可以像往常一樣實例化並使用它。

Derived<int> e(5);  
e.ret(); 
+0

是否有可能像下面的代碼? Base * p [10]; p [0] = new Derived (5); – luo

+0

我得到一個錯誤:在'p'之前缺少模板參數 – luo

+0

@luo此解決方案將限制您的數組爲'int'elements。看看基督徒對一個通用容器的評論。 –

0

它看起來像你想CRTP

的想法是訪問基類中派生類的成員。請注意,您將無法包含它們的異構列表。

template<typename D> 
struct Base { 
    void doThings() { 
     // access the derived class getT function 
     auto var = static_cast<D&>(*this).getT(); 

     cout << var << endl; 
    } 
}; 

template<typename T> 
struct Derived : Base<Derived> { 
    T getT() { 
     return myT; 
    } 

private: 
    T myT; 
};