// bolgcontent.cpp : 定義控制台應用程式的進入點。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
/*類模板繼承的例子
*一、繼承模板參數
*/
template<typename Base,int D>
class Discriminator:public Base{};
/*二、遞迴模板模式
*即衍生類別將本身作為模板參數傳給基類,最簡單情形如下
*/
template <typename Derived>
class CriousBase{
//……
};
class Crious:public CriousBase<Crious>{};
template<typename T>
class CriousTemplate:public CriousBase<CriousTemplate<T> >
{};
//CRPT 的一個簡單的應用就是記錄每個類構造的總個數
// templatetest.cpp : 定義控制台應用程式的進入點。
//
#include "stdafx.h"
#include <iostream>
#include <typeinfo>
#include <string>
using namespace std;
template <typename CountedType>
class ObjectCounter{
private:
static size_t count;
protected:
//預設建構函式
ObjectCounter(){
++ObjectCounter<CountedType>::count;
}
//拷貝建構函式
ObjectCounter(ObjectCounter const &){
++ObjectCounter<CountedType>::count;
}
//解構函式
~ObjectCounter(){
--ObjectCounter<CountedType>::count;
};
public:
//返回存在對象的個數
static size_t live(){
return ObjectCounter<CountedType>::count;
}
};
template<typename CountedType>
size_t ObjectCounter<CountedType>::count=0;
template <typename T>
class countt:public ObjectCounter<countt<T>>
{
public:
countt()
{}
};
int _tmain(int argc, _TCHAR* argv[])
{
countt<int> tt;
cout<<tt.live()<<endl;
getchar();
return 0;
}
//三、參數化虛擬性
class NotVirtual{
};
class Virtual{
public:
virtual void foo(){
}
};
template<typename VBase>
class Base:private VBase{
public:
//foo()的虛擬性依賴於他的基類VBase中的聲明
void foo(){
std::cout<<"Base::foo()"<<endl;
}
};
template<typename V>
class Derived:public Base<V>{
public:
void foo(){
std::cout<<"Derived::foo()"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Base<NotVirtual> *p1=new Derived<NotVirtual>;
p1->foo();//調用Base::foo()
Base<Virtual> *p2=new Derived<Virtual>;
p2->foo();//調用Derived::foo()
return 0;
}