模板基類
⑴ 類模板的類模板的派生
可以從類模板派生出新的類,既可以派生類模板,也可以派生回非模板類。派生方法答:
⑴ 從類模板派生類模板可以從類模板派生出新的類模板,它的派生格式如下例所示:
template <class T>
class base
{
……
};
template <class T>
class derive:public base<T>
{
……
};
與一般的類派生定義相似,只是在指出它的基類時要綴上模板參數,即base<T>。
⑵ 從類模板派生非模板類 可以從類模板派生出非模板類,在派生中,作為非模板類的基類,必須是類模板實例化後的模板類,並且在定義派生類前不需要模板聲明語句:template<class>。例如:
template <class T>
class base
{
……
};
class derive:public base<int>
{
……
};
在定義derive類時,base已實例化成了int型的模板類。
⑵ 模板類子類該怎麼實例化為什麼這么寫報非法基類
所謂「實例化子類的對抄象前要先實例化父類中的內容,為父類初始化」,是指當子類正在實例化時,總是鏈式調用父類構造方法初始化父類空間。
換句話說,子類的構造方法必須先調用父類的構造方法,完了才能幹別的初始化工作。
如果子類沒有顯式調用語句,編譯器會隱式幫你加上。
⑶ C++中的模塊包括什麼類模版可以從普通類派生,為什麼普通基類不能派生類模版
錯別字真多。來。。
C++中模板源包括類模板和函數模板
普通基類也可以派生模板類的
根據建立對象的實際數據類型,編譯器把類模板實例化為模板類
並不能從構造函數的參數列表推斷模板實例化參數類型。類模板的參數類型並不一定會體現在構造函數的參數列表中的,比如構造函數參數列表是void
⑷ c++裡面抽象 類 模板各有啥關系呀
抽象:提取事物的來公共部分,忽自略各自特別的地方,即「求同存異」。
類是對象的抽象,模板是類的抽象(當然不全是),這些是C++提供的OOP手段。
最終達到的目的是代碼充分復用,以便於維護。
「抽象」不專屬於C++,要知道OOP先於C++誕生!
⑸ C++模板類的繼承
類模板可以繼承也可以被繼承。
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;//查找被延遲了
}
};
如果使用修改方案二,如果原來的非受限非依賴型名稱是被用於虛函數調用的話,
那麼引入依賴性的限定的話,那麼這種引入依賴性的限定將會近之虛函數調用,
從而也會改變程序的含義,當遇到第二種情況不適合的情況,可以採用方案一
⑹ 聲明 類模板類的格式是什麼
c++:
class 類名 : [訪問控制符] 基類名 {
public:
//公有成員聲明
protected:
//保護成員聲明
private:
//私有成員申明
};
⑺ 關於靜態模板類實現多態,請仔細講解,給高分,謝謝
在調用參數的某個方法的中,如Fun(type a)
如果這個參數(a)的類型是基類,那麼調用a的方法就是常見的面向回對象的多態。答a.fun1.
如果Fun(type a)變為一個模板方法,並且參數類型是T
templete<typename T>
Fun(T a)
那麼a.fun1 這個時候就會在編譯期根據T的類型,調用相應的方法,來實現多態。
⑻ 模板怎樣實現繼承,基類模板指針要實現指向派生類,需要哪些代碼,求給個實例
因為繼承描述了 「 是一種 」 關系, 所以如果B類繼承A類,那麼B類對象就是A類對象,專所以A類指針屬或者引用就可以指向派生類的對象。比如 Triangle類(三角形類)繼承Shape類(形狀類),那麼定義一個Triangle對象,這對象既是Triangle(三角形)也是Shade(形狀)。這種「是一種」關系在面向對象語言中都是適用,不只是C++。如果基類指針指向派生類對象,那麼該指針和派生類對象的指針相等嗎?不一定相等,派生類指針轉換為基類指針時可能需要進行一定的轉換(自動進行),所以不一定相等。
⑼ 基類模板的protected成員不能繼承類模板的繼承問題怎麼處理
繼承類確實是無法直接訪問基類的受保護的成員的,但是你可以通過調用基類的public 函數去獲取基類受保護的成員變數的值
⑽ C++中普通的基類能否派生類模板
沒試過,但是最好不要這樣做,因為派生類對象中含有基類的一部分,所以如果派生類定義為模板而基類是指定類型則會帶來很多不變