// constructorofclassderivedfromtemplateclass.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
template <class T>
class A
{
public:
A()
{
}
A(T c)
{
}
A(A &a)
{
}
~A()
{
}
A &operator= (A &a)
{
return *this;
}
};
template <class T>
class B : public A<T>
{
public:
B()// 缺省構造函數將調用模板基類的缺省構造函數
{
}
B(T c) : A(c)// 非缺省構造函數不會調用模板基類的非缺省構造函數
{// 因此如需模板基類的非缺省構造函數,應在派生類中應用初始化參數列表顯式調用模板基類的非缺省構造函數
}
//B(B &b) : A(b)// 拷貝構造函數將重載模板基類的拷貝構造函數
//{// 因此如需模板基類的拷貝構造函數,可在派生類中不定義拷貝構造函數,
//}// 或者亦可在派生類中應用初始化參數列表顯式調用模板基類的拷貝構造函數
~B()// 析構函數將調用模板基類的析構函數
{
}
//B &operator= (B &b)// 重載賦值運算符將重載模板基類的重載賦值運算符
//{// 因此如需模板基類的重載賦值運算符,應在派生類中不定義重載賦值運算符
// return *this;
//}
};
int _tmain(int argc, _TCHAR* argv[])
{
B<int> b, c;
b = c;
B<int> d(1);
B<int> e(c);
return 0;
}
// 派生類對模板基類 缺省構造函數 析構函數 非缺省構造函數 拷貝構造函數 重載賦值運算符
// 隱式調用 yes yes no no no
// 可手動顯式調用 yes no yes yes no
// 繼承 no no no yes yes
// 重載 no no no yes yes
// remark : 派生類對模板基類的構造函數和析構函數是隱式調用的,而不是繼承或重載的。這體現爲派生類在構造和析構時,派生類和模板基類的構造函數和析構函數都進行了調用。
// 派生類對模板基類不會繼承非缺省構造函數,因此也就沒有必要討論重載非缺省構造函數了,但是派生類對模板基類可以手動地顯式調用非缺省構造函數。
// mem : 派生類對模板基類,缺省構造函數和析構函數是隱式調用的
// 派生類對模板基類,只有且所有構造函數都可在初始化參數列表中顯式調用
// 派生類對模板基類,拷貝構造函數和重載賦值運算符是可以繼承和重載的