1. 程式人生 > >虛擬函式和純虛擬函式的作用與區別

虛擬函式和純虛擬函式的作用與區別

虛擬函式為了過載和多型的需要,在基類中是有定義的,即便定義是空,所以子類中可以重寫也可以不寫基類中的此函式!

純虛擬函式在基類中是沒有定義的,必須在子類中加以實現,很像java中的介面函式!

虛擬函式

引入原因:為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。

class Cman

{

public:

virtual void Eat(){……};

void Move();

private:

};

class CChild : public CMan

{

public:

virtual void Eat(){……};

private:

};

CMan m_man;

CChild m_child;

CMan *p ;//這才是使用的精髓,如果不定義基類的指標去使用,沒有太大的意義

p = &m_man ;

p->Eat(); //始終呼叫CManEat成員函式,不會呼叫 CChild 

p = &m_child;

p->Eat(); //如果子類實現(覆蓋)了該方法,則始終呼叫CChildEat函式

//不會呼叫CMan  Eat 方法;如果子類沒有實現該函式,則呼叫CManEat函式

p->Move(); //子類中沒有該成員函式,所以呼叫的是基類中的

純虛擬函式

引入原因:

1、同虛擬函式

2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。

純虛擬函式就是基類只定義了函式體,沒有實現過程,定義方法如:virtual void Eat() = 0; 不要cpp中定義;純虛擬函式相當於介面,不能直接例項話,需要派生類來實現函式定義;

有的人可能在想,定義這些有什麼用啊,我覺得很有用,比如你想描述一些事物的屬性給別人,而自己不想去實現,就可以定義為純虛擬函式。說的再透徹一些。比如蓋樓房,你是老闆,你給建築公司描述清楚你的樓房的特性,多少層,樓頂要有個花園什麼的建築公司就可以按照你的方法去實現了,如果你不說清楚這些,可能建築公司不太瞭解你需要樓房的特性。用純需函式就可以很好的分工合作了

虛擬函式和純虛擬函式區別

觀點一:

類裡宣告為虛擬函式的話

,這個函式是實現的,哪怕是空實現,它的作用就是為了能讓這個函式在它的子類裡面可以被過載,這樣的話,這樣編譯器就可以使用後期繫結來達到多型了

純虛擬函式只是一個介面,是個函式的宣告而已,它要留到子類裡去實現。

class A{

protected:

void foo();//普通類函式

virtual void foo1();//虛擬函式

virtual void foo2() = 0;//純虛擬函式

}

觀點二:

虛擬函式在子類裡面也可以不過載的;但純虛必須在子類去實現,這就像Java的介面一樣。通常我們把很多函式加上virtual,是一個好的習慣,雖然犧牲了一些效能,但是增加了面向物件的多型性,因為你很難預料到父類裡面的這個函式不在子類裡面不去修改它的實現

觀點三:

虛擬函式的類用於實作繼承,繼承介面的同時也繼承了父類的實現。當然我們也可以完成自己的實現。純虛擬函式的類用於介面繼承,主要用於通訊協議方面。關注的是介面的統一性,實現由子類完成。一般來說,介面類中只有純虛擬函式的。

觀點四:

帶純虛擬函式的類叫虛基類,這種基類不能直接生成物件,而只有被繼承,並重寫其虛擬函式後,才能使用。這樣的類也叫抽象類。

虛擬函式是為了繼承介面和預設行為

純虛擬函式只是繼承介面,行為必須重新定義

轉載自:http://blog.163.com/[email protected]/blog/static/1440667912010111693516434/

相關推薦

虛擬函式虛擬函式作用區別

虛擬函式為了過載和多型的需要,在基類中是有定義的,即便定義是空,所以子類中可以重寫也可以不寫基類中的此函式! 純虛擬函式在基類中是沒有定義的,必須在子類中加以實現,很像java中的介面函式! 虛擬函式 引入原因:為了方便使用多型特性,我們常常需要在基類中定義虛擬函式

虛擬函式虛擬函式區別(轉載)

首先:強調一個概念定義一個函式為虛擬函式,不代表函式為不被實現的函式。定義他為虛擬函式是為了允許用基類的指標來呼叫子類的這個函式。定義一個函式為純虛擬函式,才代表函式沒有被實現。定義純虛擬函式是為了實現一個介面,起到一個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。1、簡介假設我們有下面的類層次:

虛擬函式虛擬函式區別

原文連結:http://blog.csdn.net/hackbuteer1/article/details/7558868 首先:強調一個概念 定義一個函式為虛擬函式,不代表函式為不被實現的函式。 定義他為虛擬函式是為了允許用基類的指標來呼叫子類的這個函式。 定義一個函式為

C++虛擬函式虛擬函式抽象類

1 虛擬函式     虛擬函式是類的一種特殊成員函式,主要是為實現C++的多型特性引入。     虛擬函式之所以“虛”是因為呼叫的虛擬函式不是在靜態編譯(靜態編聯)時確定,而是在執行時通過動態編聯確定的。     多型核心理念即是通過基類訪問派生的子類,通常情況是藉助基類指

c++中虛擬函式虛擬函式定義

      只有用virtual宣告類的成員函式,使之成為虛擬函式,不能將類外的普通函式宣告為虛擬函式。因為虛擬函式的作用是允許在派生類中對基類的虛擬函式重新定義。所以虛擬函式只能用於類的繼承層次結構中。      一個成員函式被宣告為虛擬函式後,在同一類族中的類就不能

什麼是虛擬函式,什麼是虛擬函式?為什麼引入虛擬函式虛擬函式?

虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是:(1)純虛擬函式只有定義,沒有實現;而虛擬函式既有定義,也有實現的程式碼。 純虛擬函式一般沒有程式碼實現部分,如virtual void print() = 0; 而一般虛擬函式必須要有程式碼的實現部分,否

一個例子徹底搞懂c++虛擬函式虛擬函式

學習C++的多型性,你必然聽過虛擬函式的概念,你必然知道有關她的種種語法,但你未必瞭解她為什麼要那樣做,未必瞭解她種種行為背後的所思所想。深知你不想在流於表面語法上的蜻蜓點水似是而非,今天我們就一起來揭開擋在你和虛擬函式(女神)之間的這一層窗戶紙。 首先,我們要

C++ 第六章(多型性虛擬函式)下篇(虛解構函式虛擬函式

一,虛解構函式 如果用new運算子建立了臨時物件,若基類中有解構函式並且定義了一個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生:系統只執行基類的解構函式,而不執行派生類的解構函式。 #include<iostream> using

C++虛擬函式虛擬函式的注意事項

1)純虛擬函式宣告如下:virtual void function()=0;純虛擬函式一定沒有定義,用來規範派生類的行為,即介面。包含純虛擬函式的類是抽象類,抽象類不能定義例項,但是可以宣告指向該抽象類的具體類的指標或者引用; 2)虛擬函式宣告:virtual void f

c++ 虛擬函式虛擬函式

靜態多型和動態多型–虛擬函式、純虛擬函式 靜態多型:程式在編譯階段就可以確定呼叫哪個函式。這種情況叫做靜態多型。比如過載 動態多型:在執行期間才可以確定最終呼叫的函式。需要通過虛擬函式+封裝+繼承實現。 虛擬函式 1、虛擬函式都必須有定義 2、虛擬函式一般用在繼

Javascript中call()方法apply()方法的作用區別

形式 時速 有效 let 調用函數 ply lane pan arguments ECMAScript規範所有函數都包含兩個非繼承的方法,分別為call()和apply(),這兩個函數都是在特定的作用域中調用函數,能改變函數的作用域,實際上是改變函數體內“t

C++語言特性?虛擬函式虛擬函式作用區別

一、C++語言的特性有哪些? 1、封裝 封裝就是將抽象得到的資料行為(或功能)相結合,形成一個有機的整體,也就是將資料與操作資料的函式程式碼進行有機地結合,形成類,其中的資料和函式都是類的組成部分,稱為類的成員。 2、繼承 繼承是從先輩處得到的屬性和行為特徵。類的繼承,是新

虛擬函式虛擬函式,抽象類,點H點CPP檔案的結合

我居然可以將if…else if和if…if一視同仁,這是變瞎的前兆嗎? 題目:列印當月每個週日的日期和週日總的次數 #include<stdio.h> int main() { int i = 1,j = 1; for(i =

虛擬函式虛擬函式、抽象類、抽象方法介面

首先講下自己最近的電話面試遇到的相關問題。1、多型的兩種實現方式?2、虛擬函式與純虛擬函式的區別,如何使用這兩種方式?3、介面和抽象類的關係?由這兩個問題開始深入的理解一下虛擬函式,純虛擬函式以及抽象類和介面之間的關係。 虛擬函式 百度定義:簡單地說,那

一步一步學習C++(類)之虛擬函式虛數

1、該函式必須與基類的虛擬函式有相同的名稱 2、該函式必須與基類的虛擬函式有相同的引數個數和相對應的引數型別 3、該函式必須與基類的虛擬函式有相同的返回值,或滿足型別相容規則的指標,引用型返回值。 4、如果派生類的函式滿足以上三個條件系統就會自動把其定為虛擬函式。這時派生類

C++之普通成員函式虛擬函式以及虛擬函式區別用法要點

普通成員函式是靜態編譯的,沒有執行時多型,只會根據指標或引用的“字面值”類物件,呼叫自己的普通函式;虛擬函式為了過載和多型的需要,在基類中定義的,即便定義為空;純虛擬函式是在基類中宣告的虛擬函式,它可以再基類中有定義,且派生類必須定義自己的實現方法。 假設我們有三個類Person、Teacher

虛擬函式虛擬函式、虛繼承

實現多型。 虛擬函式都是動態繫結,繫結的是動態型別,所對應的函式或屬性依賴於物件的動態型別,發生在執行期; 虛擬函式 類裡如果聲明瞭虛擬函式,這個函式是實現的,哪怕是空實現,它的作用就是為了能讓這個函式在它的子類裡面可以被覆蓋,這樣的話,這樣編譯器就可以使用後期繫結來達到多型

虛解構函式虛解構函式作用

1 虛解構函式 作用: 當使用基類的指標刪除一個派生類的物件時,可以呼叫派生類的解構函式。由於有虛擬函式表的存在,這裡就發生了多型,使得派生類的解構函式能夠被呼叫。反之,如果基類的解構函式不是虛擬函式,則使用基類的指標刪除派生類的物件時,不會呼叫派生類的解構函式

【C++】在繼承中虛擬函式虛擬函式、普通函式,三者的區別

1.虛擬函式(impure virtual)   C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現。   子類可以重寫父類的虛擬函式實現子類的特殊化。   如下就是一個父類中的虛擬函式: class A { public: virt

C/C++ :C++實函式虛擬函式虛擬函式函式重寫

C++實函式、虛擬函式、純虛擬函式、函式重寫 和以前一樣,先做好準備工作。程式碼和以前差不多。 首先是父類,People; 標頭檔案: #ifndef PEOPLE_H #define PEOPLE_H #include<iostream> usi