目錄
1.多態(tài)的基本語法
2.多態(tài)的原理剖析
示例:計(jì)算機(jī)類?
3.純虛函數(shù)和抽象類
示例:制作飲品
4.虛析構(gòu)和純虛析構(gòu)?
示例:電腦組裝
1.多態(tài)的基本語法
代碼示例:
#include<bits/stdc++.h>
using namespace std;
class music
{
public:
//加virtual實(shí)現(xiàn)晚綁定
virtual void listen()
{
cout << "listen music" << endl;
}
};
class rock : public music
{
public:
void listen()
{
cout << "listen rock" << endl;
}
};
//不加virtual是地址早綁定
//如果想要聽rock就應(yīng)該讓地址晚綁定,或者說在運(yùn)行階段進(jìn)行綁定
void dolisten(music &m)
{
m.listen();
}
int main()
{
rock r;
dolisten(r);
return 0;
}
?
2.多態(tài)的原理剖析
空類的大小為1?
加了virtual后會(huì)變?yōu)?或8個(gè)字節(jié),這恰好是一個(gè)指針的大小
#include<bits/stdc++.h>
using namespace std;
class music
{
public:
//加virtual實(shí)現(xiàn)晚綁定
virtual void listen()
{
cout << "listen music" << endl;
}
};
class rock : public music
{
public:
void listen()
{
cout << "listen rock" << endl;
}
};
//不加virtual是地址早綁定
//如果想要聽rock就應(yīng)該讓地址晚綁定,或者說在運(yùn)行階段進(jìn)行綁定
void dolisten(music &m)
{
m.listen();
}
int main()
{
rock r;
cout << sizeof(rock) << endl;
return 0;
}
?
vfptr是一個(gè)虛函數(shù)(表)指針
當(dāng)子類重寫父類的虛函數(shù),子類中的虛函數(shù)表位置會(huì)替換成子類的虛函數(shù)地址
簡(jiǎn)單理解:就是父類會(huì)將它的函數(shù)繼承給它的子類,但當(dāng)子類使用virtual(多態(tài)后)會(huì)將父類繼承給它的覆蓋掉
多態(tài)使用條件:父類的指針或者引用指向子類對(duì)象
示例:計(jì)算機(jī)類?
#include<bits/stdc++.h>
using namespace std;
class calculator
{
public:
virtual int getresult()
{
return 0;
}
int x;
int y;
};
class addcalculator : public calculator
{
public:
int getresult()
{
return x + y;
}
};
class subcalculator : public calculator
{
public:
int getresult()
{
return x - y;
}
};
int main()
{
//多態(tài)實(shí)現(xiàn)計(jì)算機(jī)的加法和減法
calculator *c = new addcalculator;
c -> x = 50,c -> y = 60;
cout << c -> getresult() << endl;
delete c;
c = new subcalculator;
c -> x = 60,c -> y = 50;
cout << c -> getresult() << endl;
delete c;
return 0;
}
?
3.純虛函數(shù)和抽象類
?
?
#include<bits/stdc++.h>
using namespace std;
class base
{
public:
virtual void func() = 0;
};
class son : public base
{
public:
virtual void func()
{
cout << "func函數(shù)調(diào)用" << '\n';
}
};
int main()
{
base *b = new son;
b -> func();
delete b;
return 0;
}
?
示例:制作飲品
?
#include<bits/stdc++.h>
using namespace std;
class drinking
{
public:
//煮水
virtual void boil() = 0;
//沖泡
virtual void brew() = 0;
//倒入杯中
virtual void pourintocup() = 0;
//加入佐料
virtual void addseasoning() = 0;
//制作飲品
void makedrinking()
{
boil();
brew();
pourintocup();
addseasoning();
}
};
class coffee : public drinking
{
public:
//煮水
virtual void boil(){
cout << "燒開水" << endl;
}
//沖泡
virtual void brew(){
cout << "加咖啡粉" << endl;
}
//倒入杯中
virtual void pourintocup(){
cout << "倒入杯中" << endl;
}
//加入佐料
virtual void addseasoning(){
cout << "加糖,加牛奶" << endl;
}
};
void make(drinking *d)
{
d -> makedrinking();
delete d;
}
int main()
{
//開始做咖啡
make(new coffee);
return 0;
}
?
4.虛析構(gòu)和純虛析構(gòu)?
#include<bits/stdc++.h>
using namespace std;
class animal
{
public:
animal()
{
cout << "animal構(gòu)造函數(shù)調(diào)用" << endl;
}
//利用虛析構(gòu)解決父類指針釋放子類對(duì)象時(shí)不干凈的問題
// virtual ~animal()
// {
// cout << "animal虛析構(gòu)函數(shù)調(diào)用" << endl;
// }
virtual ~animal() = 0;
//純虛析構(gòu),需要聲明也需要實(shí)現(xiàn)
//有了純虛析構(gòu)之后,這個(gè)類也屬于抽象類,無法實(shí)例化對(duì)象
virtual void speak() = 0;
};
animal::~animal()
{
cout << "animal的純虛構(gòu)函數(shù)調(diào)用" << endl;
}
class cat : public animal
{
public:
cat(string name)
{
cout << "cat構(gòu)造函數(shù)調(diào)用" << endl;
this -> name = new string(name);
}
virtual void speak()
{
cout << *name << "在說話" << endl;
}
~cat()
{
cout << "cat析構(gòu)函數(shù)調(diào)用" << endl;
if(name != NULL)
{
delete name;
name = NULL;
}
}
string *name;
};
int main()
{
animal *a = new cat("Tom");
a -> speak();
delete a;
return 0;
}
?文章來源:http://www.zghlxwxcb.cn/news/detail-835857.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-835857.html
示例:電腦組裝
#include<bits/stdc++.h>
using namespace std;
class cpu
{
public:
virtual void calculator() = 0;
};
class videocard
{
public:
virtual void display() = 0;
};
class memory
{
public:
virtual void storage() = 0;
};
class computer
{
public:
computer(cpu *c,videocard *v,memory *m)
{
this -> c = c;
this -> v = v;
this -> m = m;
}
void make()
{
c -> calculator();
v -> display();
m -> storage();
}
~computer()
{
if(c != NULL)
{
delete c;
c = NULL;
}
if(v != NULL)
{
delete v;
v = NULL;
}
if(m != NULL)
{
delete m;
m = NULL;
}
}
private:
cpu *c;
videocard *v;
memory *m;
};
class intelcpu : public cpu
{
public:
virtual void calculator()
{
cout << "intelcpu" << endl;
}
};
class amd : public videocard
{
public:
virtual void display()
{
cout << "amdvideocard" << endl;
}
};
class kingston : public memory
{
public:
virtual void storage()
{
cout << "kingstonmemory" << endl;
}
};
int main()
{
cpu *c = new intelcpu;
videocard *v = new amd;
memory *m = new kingston;
computer *com = new computer(c,v,m);
com -> make();
delete com;
return 0;
}
?
到了這里,關(guān)于C++類和對(duì)象——多態(tài)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!