虛函數、模板

  1. 虛函數

 代碼

using namespace std;

class ABase {

public:

virtual void init();

};



void ABase::init() {

cout << "load ABase" << endl;

}



class A : public ABase{

public:

void init();

};



void A::init() {

cout << "A class" << endl;

}



template<class T>

class BBase {

public:

virtual void init() = 0;

};



class B : BBase<B> {

public:

void init();

};



int main()

{

A a;

ABase* ab = &a;

a.init();

ab->init();



}

 

 

運行結果

 

 

總結

  1. 純虛函數不可實例化,子類必須實現該方法
  2. 聲明爲虛函數的方法,

 

2.模板

代碼

using namespace std;



template<class T>

class BBase {

public:

virtual void init();//子類未定義init方法,所以子類調用父類的init

vector<T> vSet; //通過子類調用父類init方法,通過模板將子類加載進vSet

void out();

};



template<class T>

void BBase<T>::init() {

T T;

vSet.push_back(T);

cout << "push_back T" << endl;

}

template <class T>

void BBase<T>::out() {

vector<T>::iterator it = vSet.begin();

for (; it != vSet.end(); ++it)

it->load();

}



class B : public BBase<B> {

public:

void load();  //子類獨有方法,無法用虛函數特效通過基類調用

};

void B::load() {

cout << "load B" << endl;

}



int main()

{

B b;

BBase<B>* bb = &b;

b.init(); //子類調用父類的init,加載vSet

bb->out();//調用子類的load方法

}

 

運行結果

push_back T

load B

請按任意鍵繼續. . .

​​​​​​​

總結

模板配合虛函數使用可以實現在基類中調用子類,無需在基類加上子類的每個方法,使子類用戶更多的自由度。

​​​​​​​

3.項目中運用

繼承關係:

class JkTrade : public TradeProcessBase < JkWork >

template < class T > class TradeProcessBase : public CreditProcess < T >

template < class T > class CreditProcess : public CreditProcessBase

程序:


CreditProcessBase{

    virtual unsigned int process() = 0; //純虛函數



    virtual bool loadData() = 0;//純虛函數

}

Template<class T>

Class CreditProcess {

T m_record;//模板定義了關鍵變量

virtual unsigned int process();//虛函數,未實現

virtual bool loadData();//虛函數,該處實現了該方法,並且定義了m_record變量

}

Tempalte<class T>

Class TradeProcessBase{

virtual unsigned int process();//虛函數,該處實現了該方法,並且調用了父類loadData方法

}

Class JkTrade {

virtual bool sendInstruction();//具體業務邏輯

}

 

入口類(此處只是描述了個大概流程):

Class CreditBack{



CreditProcessBase * m_trade = New JkTrade; //生成業務類

ParaManager * m_paraMan;

Bool CreditBack::loopProcess(){

m_trade->process(); //基類指針,調用了具體子類實現的process方法,這裏是TradeProcessBase:process,接着實例變量m_record爲JkTrade 類型,通過m_record實現了具體子類的的方法。

}

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章