虚函数、模板

本文探讨了C++中的虚函数和模板的概念及其使用。虚函数允许在基类中调用子类的方法,而模板则提供了泛型编程的能力。通过结合使用,可以在不增加基类方法数量的情况下,赋予子类用户更大的灵活性。文章还提到了在实际项目中的应用,展示了一个继承层次结构的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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实现了具体子类的的方法。

}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值