- 虛函數
代碼
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();
}
運行結果
總結
- 純虛函數不可實例化,子類必須實現該方法
- 聲明爲虛函數的方法,
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實現了具體子類的的方法。
}
}