C++ 虛函數(shù)與純虛函數(shù)的使用與區(qū)別
什么是虛函數(shù):
虛函數(shù) 是在基類中使用關(guān)鍵字 virtual 聲明的函數(shù),在C++ 語(yǔ)言中虛函數(shù)可以繼承,當(dāng)一個(gè)成員函數(shù)被聲明為虛函數(shù)之后,其派生類中的同名函數(shù)都自動(dòng)生成為虛函數(shù),
虛函數(shù)主要體驗(yàn)C++的多態(tài)方面,(多態(tài)是參數(shù)個(gè)數(shù)和類型相同而實(shí)現(xiàn)功能不同的函數(shù))
為了更好的里面虛函數(shù)請(qǐng)看下面的demo
#include <iostream>
#include <string>
using namespace std;
class Aname
{
public:
virtual void function_name()
{
cout << "Aname調(diào)用了function_name" << endl;
}
};
class Bname:public Aname
{
public:
void function_name()
{
cout << "Bname調(diào)用了function_name" << endl;
}
};
int main()
{
Aname *a = new Bname();
a->function_name();
}
這里由于類Aname 里面的function_name 被聲明為虛函數(shù), 所以雖然指針a 指向Aname 卻調(diào)用了
Bname 里面的function_name
打印結(jié)果為

如果類Aname 里面的函數(shù)沒有聲明虛函數(shù), 是調(diào)用A里面的函數(shù)的,
虛函數(shù)的注意事項(xiàng):
1 只有類的成員函數(shù)才能為虛函數(shù)
2 靜態(tài)成員函數(shù)不能為虛函數(shù),內(nèi)聯(lián)函數(shù)和構(gòu)造函數(shù)不能為虛函數(shù)
純虛函數(shù)
是指被表明為不被具體實(shí)現(xiàn)的虛成員函數(shù),它不具備函數(shù)的功能,它在基類中沒有定義,但要求任何派生類都要定義自己的實(shí)現(xiàn)方法。在基類中實(shí)現(xiàn)純虛函數(shù)的方法是在函數(shù)原型后加"=0"
例如:
virtual void funtion1()=0
demo 認(rèn)識(shí)下純虛函數(shù)
#include <iostream>
#include <string>
using namespace std;
class Aname
{
public:
virtual void function_name() = 0;
};
class Bname : public Aname
{
public:
void function_name()
{
cout << "Bname調(diào)用了function_name" << endl;
}
};
int main()
{
Aname *a = new Bname();
a->function_name();
}
純虛函數(shù)的注意事項(xiàng):
1 純虛函數(shù)不能被實(shí)例化
2 virtual void function_name() = 0; 中 viertual 不能去掉,否則會(huì)報(bào)錯(cuò)
虛函數(shù)與純虛函數(shù)區(qū)別
1. 虛函數(shù)和純虛函數(shù)可以定義在同一個(gè)類(class)中,含有純虛函數(shù)的類被稱為抽象類(abstract class),而只含有虛函數(shù)的類(class)不能被稱為抽象類(abstract class)。
2. 虛函數(shù)可以被直接使用,也可以被子類(sub class)重載以后以多態(tài)的形式調(diào)用,而純虛函數(shù)必須在子類(sub class)中實(shí)現(xiàn)該函數(shù)才可以使用,因?yàn)榧兲摵瘮?shù)在基類(base class)只有聲明而沒有定義。
3. 虛函數(shù)和純虛函數(shù)都可以在子類(sub class)中被重載,以多態(tài)的形式被調(diào)用。
4. 虛函數(shù)和純虛函數(shù)通常存在于抽象基類(abstract base class -ABC)之中,被繼承的子類重載,目的是提供一個(gè)統(tǒng)一的接口。
5. 虛函數(shù)的定義形式:virtual {method body}
純虛函數(shù)的定義形式:virtual { } = 0;
在虛函數(shù)和純虛函數(shù)的定義中不能有static標(biāo)識(shí)符,原因很簡(jiǎn)單,被static修飾的函數(shù)在編譯時(shí)候要求前期bind,然而虛函數(shù)卻是動(dòng)態(tài)綁定(run-time bind),而且被兩者修飾的函數(shù)生命周期(life recycle)也不一樣。
6. 虛函數(shù)必須實(shí)現(xiàn),如果不實(shí)現(xiàn),編譯器將報(bào)錯(cuò),錯(cuò)誤提示為:
error LNK****: unresolved external symbol "public: virtual void __thiscall
ClassName::virtualFunctionName(void)"
7. 對(duì)于虛函數(shù)來說,父類和子類都有各自的版本。由多態(tài)方式調(diào)用的時(shí)候動(dòng)態(tài)綁定。
8. 實(shí)現(xiàn)了純虛函數(shù)的子類,該純虛函數(shù)在子類中就編程了虛函數(shù),子類的子類即孫子類可以覆蓋
該虛函數(shù),由多態(tài)方式調(diào)用的時(shí)候動(dòng)態(tài)綁定。
9. 虛函數(shù)是C++中用于實(shí)現(xiàn)多態(tài)(polymorphism)的機(jī)制。核心理念就是通過基類訪問派生類定義的
函數(shù)
10. 多態(tài)性指相同對(duì)象收到不同消息或不同對(duì)象收到相同消息時(shí)產(chǎn)生不同的實(shí)現(xiàn)動(dòng)作。C++支持兩種多態(tài)性:編譯時(shí)多態(tài)性,運(yùn)行時(shí)多態(tài)性。
a.編譯時(shí)多態(tài)性:通過重載函數(shù)實(shí)現(xiàn)
b 運(yùn)行時(shí)多態(tài)性:通過虛函數(shù)實(shí)現(xiàn)。
11. 如果一個(gè)類中含有純虛函數(shù),那么任何試圖對(duì)該類進(jìn)行實(shí)例化的語(yǔ)句都將導(dǎo)致錯(cuò)誤的產(chǎn)生,因?yàn)槌橄蠡?ABC)是不能被直接調(diào)用的。必須被子類繼承重載以后,根據(jù)要求調(diào)用其子類的方法。
到此這篇關(guān)于C++ 虛函數(shù)與存虛函數(shù)的使用與區(qū)別的文章就介紹到這了,更多相關(guān)C++ 虛函數(shù)與存虛函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中string轉(zhuǎn)換為char*類型返回后亂碼問題解決
這篇文章主要介紹了C++中string轉(zhuǎn)換為char*類型返回后亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
C語(yǔ)言編寫Linux守護(hù)進(jìn)程實(shí)例
這篇文章主要介紹了C語(yǔ)言編寫Linux守護(hù)進(jìn)程實(shí)例,本文講解了守護(hù)進(jìn)程及其特性、守護(hù)進(jìn)程的編程要點(diǎn)、守護(hù)進(jìn)程代碼實(shí)例等內(nèi)容,需要的朋友可以參考下2015-02-02
C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有圖形界面時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有圖形界面時(shí)鐘,獲得本地時(shí)間,輸出文字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++?使用getline()從文件中讀取一行字符串方法示例
這篇文章主要介紹了C++?使用getline()從文件中讀取一行字符串方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)用順序詳解
C++ 語(yǔ)言一直被批評(píng)太復(fù)雜了,很多細(xì)節(jié)的地方需要仔細(xì)推敲,甚至其構(gòu)造函數(shù)和析構(gòu)的調(diào)用順序也成為了一個(gè)讓人迷惑的問題,在此我做了簡(jiǎn)單的總結(jié)。這篇文章主要介紹了C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)用順序,需要的朋友可以參考借鑒。2017-01-01
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析二叉樹的操作
二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-04-04

