1. 程式人生 > >空的虛擬函式與純虛擬函式的區別

空的虛擬函式與純虛擬函式的區別

以下內容轉載自某個論壇中的回覆。 如果其中一個比另外一個必然好,怎麼會有兩個同時存在的情況?差的那個肯定早被淘汰了。所以問“虛擬函式是寫成純虛擬函式好還是寫成虛的空函式好”本身就是不合邏輯的,他們當然各有各的適宜場景 

純虛擬函式適用於兩種情況 
a) 介面類情況,在介面類情況下,不允許類內部包含任何實現,常見的是在DLL中包裝一個實現,而通過純虛類提供介面。在這種情況下,介面只告訴使用者有那些方法可以用,而不在類中提供任何實現。不提供實現的好處在於,對於一個純虛擬函式,使用dll的程式不需要找到對應的符號表,不需要連結那個dll對應的lib,只要標頭檔案即可 

b) 基類希望每個派生類必須實現一個方法。例如你寫一個GetInstanceType方法,你希望每種派生類都必須提供這個方法,如果你寫了一個空的虛擬函式,編譯器不會幫你去強迫派生類實現 

空的虛擬函式適用於派生類可以也可以不實現的情況。一般是對於同一個基類的不同派生類,他們提供的功能可能是不一樣的,因此一些虛擬函式不是必須被實現 

例如我們寫一個數據庫訪問類,提供一對Lock/Unlock函式。但是兩個派生類中,一個是訪問不支援多連結的資料庫,根本不需要上鎖,而另外一個訪問基於多個連結的資料庫,需要隨時上鎖。但是如果我們在基類中如果不提供Lock/Unlock,使用這個類的客戶端就需要了解派生類是什麼,然後選擇是否呼叫Lock/Unlock,這就違背了封裝原則 

相關推薦

虛擬函式虛擬函式區別

以下內容轉載自某個論壇中的回覆。 如果其中一個比另外一個必然好,怎麼會有兩個同時存在的情況?差的那個肯定早被淘汰了。所以問“虛擬函式是寫成純虛擬函式好還是寫成虛的空函式好”本身就是不合邏輯的,他們當然各有各的適宜場景  純虛擬函式適用於兩種情況  a) 介面類情況,在介

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

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

探討虛擬函式虛擬函式區別

轉載請註明t1234xy4原創:http://blog.csdn.net/t1234xy4/article/details/51191270 《C++ Primer》書上學習得到的基礎: 純虛擬函式: 1、純虛擬函式只宣告,沒有定義。書寫=0說明為

虛解構函式虛擬函式

虛解構函式 通過基類的指標刪除派生類物件時,通常情況只調用基類的解構函式 但是,刪除一個派生類物件時,應該先呼叫派生類的解構函式,然後呼叫基類的解構函式(構造時自頂向下,析構時自底向上) 這種情況會產生記憶體洩漏,最終導致系統應可用記憶體不足而崩潰 解決辦法 把基類的解構函式宣告為virtual,此

【C++學習筆記】 虛擬函式虛擬函式概念

源至:https://blog.csdn.net/hackbuteer1/article/details/7558868 虛擬函式:定義一個函式為虛擬函式,不代表函式為不被實現的函式,定義他為虛擬函式是為了允許用基類的指標來呼叫子類的這個函式。(注意:子類中非基類虛擬函式不能被基類呼叫) 純虛擬

C++過載覆蓋和隱藏,虛擬函式虛擬函式

這幾個概念都有一個共同點:函式名稱相同,所以不免讓人混淆,大致的區別如下:過載(overload):必須在一個域中,函式名稱相同但是函式引數不同,過載的作用就是同一個函式有不同的行為,因此不是在一個域中的函式是無法構成過載的,這個是過載的重要特徵覆蓋(override):覆

虛擬函式虛擬函式

http://blog.sina.com.cn/s/blog_624ca8080100f7th.html 1、基本形式:virtual ReturnType Function_1();            //虛擬函式宣告virtual ReturnType Func

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

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

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

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

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

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

虛擬函式虛擬函式區別

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

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

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

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

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

虛擬函式實現機制、建構函式、解構函式能否為虛擬函式虛擬函式

 虛擬函式 虛擬函式是C++中用於實現多型的機制。核心理念就是通過基類指標訪問派生類中定義的函式。虛擬函式允許子類重新定義成員函式,繼承時不重新定義虛擬函式也是可以的。而子類重新定義父類的做法稱為覆蓋(override),或者稱為重寫。如果父類或者祖先類中函式func()為虛

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

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

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

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

虛基類、虛擬函式虛擬函式的用法及其區別

c程式的記憶體佈局是: 1. 程式碼段 code or text 2. 只讀資料段 ro data 3. 已初始化讀寫資料段 rw data 4. 未初始化讀寫資料段 bss 5. 堆

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

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

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

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

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

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