第一次写博客记录自己学习c++中纯虚函数、类的组合及多态性知识总结。
纯虚函数:声明形式为:? ? ? virtual? 函数类型? 函数名(函数形参表)?=0;
? ? ? ?含有纯虚函数的类是抽象类,抽象类不能实例化,需要由其派生类具体给出纯虚函数的函数体的定义,如果派生类没有给出纯虚函数的函数体,则该派生类依然是一个抽象类。
类的组合:析构函数的调用顺序与构造函数的调用相反。
有new开辟在堆区的对象,需要配对使用delete释放内存。
学习案例为电脑的组装:Intel电脑和lev电脑。电脑组成三部件cpu、xianka、neicun。
#include<iostream>
using namespace std;
//抽象的cpu类
class Cpu{
public:
virtual void jisuan()=0;
};
//抽象的显卡类
class xianka{
public:
virtual void display()=0;
};
//抽象的内存条类
class neicun{
public:
virtual void memeory()=0;
};
//类的组合
class computer{
public:
//组合类的构造函数
computer(Cpu * cpu,xianka *xk,neicun * cunchu): m_cpu(cpu),m_xk(xk),m_cunchu(cunchu) {
cout<<"电脑已经装载"<<endl;
}
//析构掉用new动态建立在堆区的3个电脑组件
~computer(){
cout<<"电脑组件正在卸载"<<endl;
if(m_cpu!=NULL){
delete m_cpu;
m_cpu=NULL;
cout<<"cpu已释放"<<endl;
}
if(m_xk!=NULL){
delete m_xk;
m_xk=NULL;
cout<<"xianka已释放"<<endl;
}
if(m_cunchu!=NULL){
delete m_cunchu;
m_cunchu=NULL;
cout<<"neicun已释放"<<endl;
}
}
void work(){
m_cpu->jisuan();
m_xk->display();
m_cunchu->memeory();
}
private:
Cpu * m_cpu;
xianka * m_xk;
neicun * m_cunchu;
};
//intel计算机组成的computer实例
class intelcpu: public Cpu{
public:
virtual void jisuan(){
cout<<"interl的cpu工作"<<endl;}
};
class intelxianka: public xianka{
public:
virtual void display(){
cout<<"interl的xianka工作"<<endl;}
};
class intelneicun: public neicun{
public:
virtual void memeory(){
cout<<"interl的内存卡工作"<<endl;}
};
//联想的计算机组成实例
class levcpu: public Cpu{
public:
virtual void jisuan(){
cout<<"lev的cpu工作"<<endl;}
};
class levxianka: public xianka{
public:
virtual void display(){
cout<<"lev的xianka工作"<<endl;}
};
class levneicun: public neicun{
public:
virtual void memeory(){
cout<<"lev的内存卡工作"<<endl;}
};
void inteldiannao(){
Cpu * intelcpu1 = new intelcpu;
xianka *intelxk = new intelxianka;
neicun * intelcunchu1 = new intelneicun;
computer * intelcomputer = new computer(intelcpu1,intelxk,intelcunchu1);
intelcomputer->work();
delete intelcomputer;
cout<<"intel电脑已释放"<<endl;
// delete intelcpu1;
// delete intelxk;
// delete intelcunchu1;
}
void levdiannao(){
computer * levcomputer = new computer(new levcpu,new levxianka,new levneicun);
levcomputer->work();
delete levcomputer;
cout<<"联想电脑已释放"<<endl;
}
//主函数
int main(){
cout<<"------intel电脑准备工作------"<<endl;
inteldiannao();
cout<<"------联想电脑准备工作------"<<endl;
levdiannao();
return 0;
}
运行结果如下图所示,可以看出组合类的构造与析构调用过程相反。
?
代码书写不规范,仅记录学习过程。欢迎大家批评指正。
|