c++ 多态学习
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 多态学习相关的知识,希望对你有一定的参考价值。
单纯的学习记录 QAQ
虚析构和纯虚析构
1.解决父类指针释放(开辟到堆区的)子类对象
2.需要具体的函数实现、
虚析构:
virtual ~类名()
{
(可为空)
}
--------------------------------------------------------
纯虚析构
virtu ~类名()=0;
(类外)
类名::~ 类名()
{
(可为空)
}
1.简易计算器
#include <iostream>
using namespace std;
class calculate
{
public:
virtual int result()=0; //纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;
int num1;
int num2;
};
class add:public calculate // “+” 功能
{
public:
int result() //子类必须重写父类虚函数
{
return num1+num2;
}
};
class mins:public calculate //“-” 功能
{
public:
int result()
{
return num1-num2;
}
};
void yinyong(calculate &calculate)
{
cout<<calculate.result()<<endl;
}
int main()
{
calculate *p=new add; //父类指针或引用指向子类对象
p->num1=10;
p->num2=20;
cout<<p->result()<<endl;
delete p; //堆区需要手动释放
mins m;
m.num1=100;
m.num2=200;
yinyong(m); //父类引用指向子类对象
return 0;
}
2.制作饮品
#include <iostream>
using namespace std;
class drinks
{
public:
virtual void boilwater()=0; //纯虚函数
virtual void brew()=0; //抽象类无法实例化对象
virtual void pour()=0; //类中只要有一个抽象函数就成为抽象类
virtual void relish()=0;
void show()
{
boilwater();
brew();
pour();
relish();
}
};
class coffee:public drinks
{
public:
void boilwater()
{
cout<<"煮水"<<endl; //重写父类纯虚函数
}
void brew()
{
cout<<"冲泡咖啡"<<endl;
}
void pour()
{
cout<<"倒入杯中"<<endl;
}
void relish()
{
cout<<"加入糖和牛奶"<<endl;
}
};
class tea:public drinks
{
public:
void boilwater()
{
cout<<"煮水煎茶"<<endl;
}
void brew()
{
cout<<"冲泡茶叶"<<endl;
}
void pour()
{
cout<<"倒入茶壶"<<endl;
}
void relish()
{
cout<<"加入柠檬"<<endl;
}
};
void dowork(drinks *p) //虚基类的指针,指向子类对象
{
p->show();
delete p;
}
int main()
{
coffee c;
c.show();
cout<<"----------------------------------------------"<<endl;
dowork(new tea);
delete new tea; //创建到堆区的tea 手动释放
return 0;
}
3.组装电脑
1.设置父类纯虚函数。(CPU,显卡,内存条)
2.不同公司要继承零件,
3.组装电脑。由于零件可能来自不同的公司,需要用指针进行控制,也就是用三个。
(用new开辟小堆区,类也能作为参数。指针可以指向用new开辟的类)
#include <iostream>
using namespace std;
class CPU
{
public:
virtual void calculate()=0;
};
class videocard
{
public:
virtual void display()=0;
};
class memory
{
public:
virtual void storage()=0;
};
//*****************************************************************************
class Intel_CPU:public CPU
{
public:
void calculate()
{
cout<<"Intel的CPU开始工作了"<<endl;
}
};
class Intel_videocard:public videocard
{
public:
void display()
{
cout<<"Intel的显卡开始工作了"<<endl;
}
};
class Intel_memory:public memory
{
public:
void storage()
{
cout<<"Intel的内存条开始工作了"<<endl;
}
};
//**********************************************************************
class Lenovo_CPU:public CPU
{
public:
void calculate()
{
cout<<"Lenovo的CPU开始工作了"<<endl;
}
};
class Lenovo_vidercard:public videocard
{
public:
void display()
{
cout<<"Lenovo的显卡开始工作了"<<endl;
}
};
class Lenovo_memory:public memory
{
public:
void storage()
{
cout<<"Lenovo的内存条开始工作了"<<endl;
}
};
//***********************************************************************
class computer
{
CPU *m1;
videocard *m2;
memory *m3;
public:
computer(CPU *m4,videocard *m5,memory *m6)
{
m1=m4;m2=m5;m3=m6;
}
void work()
{
m1->calculate();
m2->display();
m3->storage();
}
~computer()
{
if(m1!=NULL)
{
delete m1;
}
if(m2!=NULL)
{
delete m2;
}
if(m3!=NULL)
{
delete m3;
}
}
};
int main()
{
//第一台电脑零件
CPU *m1=new Intel_CPU;
videocard *m2=new Intel_videocard;
memory *m3=new Intel_memory;
cout<<"第一台电脑开始工作: "<<endl;
computer *c1=new computer(m1,m2,m3);
c1->work();
delete c1;
cout<<endl<<"----------------------------------------"<<endl;
cout<<"第二台电脑开始工作:"<<endl;
computer *c2=new computer(new Lenovo_CPU,new Lenovo_vidercard,new Lenovo_memory);
c2->work();
delete c2;
cout<<endl<<"----------------------------------------"<<endl;
cout<<"第三台电脑开始工作:"<<endl;
computer *c3=new computer(new Intel_CPU,new Lenovo_vidercard,new Intel_memory);
c3->work();
delete c3;
}
输出:
第一台电脑开始工作:
Intel的CPU开始工作了
Intel的显卡开始工作了
Intel的内存条开始工作了
----------------------------------------
第二台电脑开始工作:
Lenovo的CPU开始工作了
Lenovo的显卡开始工作了
Lenovo的内存条开始工作了
----------------------------------------
第三台电脑开始工作:
Intel的CPU开始工作了
Lenovo的显卡开始工作了
Intel的内存条开始工作了
Process returned 0 (0x0) execution time : 0.047 s
Press any key to continue.
以上是关于c++ 多态学习的主要内容,如果未能解决你的问题,请参考以下文章