單純的學習記錄 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.