虛擬函式,純虛擬函式
虛擬函式
在函式定義時前面新增一個virtual修飾,所產生的函式就是虛擬函式。
虛擬函式是為了實現多型,重定向物件行為的函式,通俗理解就是父類自己不怎麼幹活,而讓孩子們幹活,但是當孩子沒有辦法幹活的時候父親也會替孩子幹活的。
有很多時候孩子們確實是想有一些具體的行為屬性。比如對於“人類”這個類來說,它是可以設定資產,而可以具體到子類中哪個人的資產上,所以這個時候“人類”這個類可以定義抽象的行為virtual(預設每個人最初的資產為0),讓子類繼承並去實現具體行為。
在程式碼中表示為:
#include <iostream>
using namespace std;
class people
{
int salary = 0;
public:
virtual void getSalary() //虛擬函式
{
cout << this->salary << endl;
}
};
class employee : public people
{
int salary=1000;
public:
void getSalary() override//override 確保基類函式被覆蓋
{
cout << this->salary << endl;
}
};
class employer : public people
{
//int salary=0;
public:
void getsomething()
{
printf("instance employer\n");
}
};
people *p1 = new employee();
p1->getSalary();
people *p2 = new employer();
p2->getSalary();
結果:
1000
0
而如果為了保證派生類會覆蓋到基類的虛擬函式,則可以在要覆蓋的函式後寫上override,這樣如果不小心拼寫錯誤無法覆蓋基類,則會報錯。
純虛擬函式
- 定義純虛擬函式的類無法new物件。
- 定義純虛擬函式的類是介面類,必須有繼承子類才能使用。
定義純虛擬函式的類不能用於生成物件,純虛擬函式的類被認為是介面類,無法直接產生物件。
#include <iostream>
using namespace std;
class people
{
public:
virtual void getSalary()=0;
};
class employee: public people
{
public:
void getSalary() override
{
cout << this->salary <<endl;
}
};
class employer: public people
{
int salary = 2000;
public:
void getsomthing()
{
cout << "get somthing"<<endl;
}
};
people *p1 = new employer();
p1->getSalary();
如以上的程式碼中在編譯時會報錯的,因為employer類中沒有對純虛擬函式getSalary進行覆蓋,所以純虛擬函式是強迫派生類必須自己定義函式行為,這個要比虛擬函式更強硬。
父親強迫孩子必須什麼事情都自己幹,不能指望父親給你做,因為父親不會做事情,這個父親的形象有點像神,因為你不可能希望神去為你做事情,而是神指派你做事情,好吧,扯遠了,我是無神論者,哈哈。
必須在employer中新增上getSalary函式才能正常編譯。
class employer: public people
{
int salary=2000;
pulbic: void getSalary(){cout<<this->salary<<endl;}
//...
};
people * p1 = new employer();
p1->getSalary();
總結
虛擬函式和純虛擬函式:相同點都是為了得到多型行為,都是進行派生和繼承;不同點是虛擬函式可以寫自己的函式體,可以建立物件,不強制子類覆蓋該函式,而純虛擬函式不能實現函式體,不能建立物件,子類必須覆蓋該函式。
* 而虛基類的概念,在我前一個文章中已經提到了,不同於虛擬函式和純虛擬函式。
相關推薦
虛擬函式,純虛擬函式,抽象類,點H與點CPP檔案的結合
我居然可以將if…else if和if…if一視同仁,這是變瞎的前兆嗎? 題目:列印當月每個週日的日期和週日總的次數 #include<stdio.h> int main() { int i = 1,j = 1; for(i =
虛擬函式,純虛擬函式
虛擬函式 在函式定義時前面新增一個virtual修飾,所產生的函式就是虛擬函式。 虛擬函式是為了實現多型,重定向物件行為的函式,通俗理解就是父類自己不怎麼幹活,而讓孩子們幹活,但是當孩子沒有辦法幹活的時候父親也會替孩子幹活的。 有很多時候孩子們確實是想
C++虛擬函式,純虛擬函式,建構函式
純虛擬函式在基類中是沒有定義的,必須在子類中加以實現,很像java中的介面函式! 虛擬函式 引入原因:為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。 class Cman { public: virtual void Eat(){……}; void Move()
C++多型,虛擬函式,虛擬函式表,純虛擬函式
1、多型性 指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。 C++支援兩種多型性:編譯時多型性,執行時多型性。 a、編譯時多型性:通過過載函式實現 ,模板(2次編譯) b、執行時多型性:通過
C++過載覆蓋和隱藏,虛擬函式與純虛擬函式
這幾個概念都有一個共同點:函式名稱相同,所以不免讓人混淆,大致的區別如下:過載(overload):必須在一個域中,函式名稱相同但是函式引數不同,過載的作用就是同一個函式有不同的行為,因此不是在一個域中的函式是無法構成過載的,這個是過載的重要特徵覆蓋(override):覆
【C++】在繼承中虛擬函式、純虛擬函式、普通函式,三者的區別
1.虛擬函式(impure virtual) C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現。 子類可以重寫父類的虛擬函式實現子類的特殊化。 如下就是一個父類中的虛擬函式: class A { public: virt
C++ 在繼承中虛擬函式、純虛擬函式、普通函式,三者的區別【轉載】
1.虛擬函式(impure virtual) C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現。 子類可以重寫父類的虛擬函式實現子類的特殊化。 如下就是一個父類中的虛擬函式: class A { public
虛擬函式/純虛擬函式,以及建構函式不能是虛擬函式原因
1.首先要了解什麼是虛擬函式: 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛擬函式(實現多型)。 作用:指向基類的指標在操作它的多型類物件時,會根據不同的類物
C++ 在繼承中虛擬函式、純虛擬函式、普通函式,三者的區別
1.虛擬函式(impure virtual) C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現。 子類可以重寫父類的虛擬函式實現子類的特殊化。 如下就是一個父類中的虛擬函式: class A { publi
虛解構函式與純虛擬函式
虛解構函式 通過基類的指標刪除派生類物件時,通常情況只調用基類的解構函式 但是,刪除一個派生類物件時,應該先呼叫派生類的解構函式,然後呼叫基類的解構函式(構造時自頂向下,析構時自底向上) 這種情況會產生記憶體洩漏,最終導致系統應可用記憶體不足而崩潰 解決辦法 把基類的解構函式宣告為virtual,此
虛擬函式和純虛擬函式的區別(轉載)
首先:強調一個概念定義一個函式為虛擬函式,不代表函式為不被實現的函式。定義他為虛擬函式是為了允許用基類的指標來呼叫子類的這個函式。定義一個函式為純虛擬函式,才代表函式沒有被實現。定義純虛擬函式是為了實現一個介面,起到一個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。1、簡介假設我們有下面的類層次:
虛擬函式、純虛擬函式、虛繼承
實現多型。 虛擬函式都是動態繫結,繫結的是動態型別,所對應的函式或屬性依賴於物件的動態型別,發生在執行期; 虛擬函式 類裡如果聲明瞭虛擬函式,這個函式是實現的,哪怕是空實現,它的作用就是為了能讓這個函式在它的子類裡面可以被覆蓋,這樣的話,這樣編譯器就可以使用後期繫結來達到多型
【C++學習筆記】 虛擬函式與純虛擬函式概念
源至:https://blog.csdn.net/hackbuteer1/article/details/7558868 虛擬函式:定義一個函式為虛擬函式,不代表函式為不被實現的函式,定義他為虛擬函式是為了允許用基類的指標來呼叫子類的這個函式。(注意:子類中非基類虛擬函式不能被基類呼叫) 純虛擬
虛擬函式和純虛擬函式的區別
原文連結:http://blog.csdn.net/hackbuteer1/article/details/7558868 首先:強調一個概念 定義一個函式為虛擬函式,不代表函式為不被實現的函式。 定義他為虛擬函式是為了允許用基類的指標來呼叫子類的這個函式。 定義一個函式為
C++虛擬函式和純虛擬函式和抽象類
1 虛擬函式 虛擬函式是類的一種特殊成員函式,主要是為實現C++的多型特性引入。 虛擬函式之所以“虛”是因為呼叫的虛擬函式不是在靜態編譯(靜態編聯)時確定,而是在執行時通過動態編聯確定的。 多型核心理念即是通過基類訪問派生的子類,通常情況是藉助基類指
c++中虛擬函式和純虛擬函式定義
只有用virtual宣告類的成員函式,使之成為虛擬函式,不能將類外的普通函式宣告為虛擬函式。因為虛擬函式的作用是允許在派生類中對基類的虛擬函式重新定義。所以虛擬函式只能用於類的繼承層次結構中。 一個成員函式被宣告為虛擬函式後,在同一類族中的類就不能
什麼是虛擬函式,什麼是純虛擬函式?為什麼引入虛擬函式和純虛擬函式?
虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是:(1)純虛擬函式只有定義,沒有實現;而虛擬函式既有定義,也有實現的程式碼。 純虛擬函式一般沒有程式碼實現部分,如virtual void print() = 0; 而一般虛擬函式必須要有程式碼的實現部分,否
虛擬函式、純虛擬函式、抽象類、抽象方法和介面
首先講下自己最近的電話面試遇到的相關問題。1、多型的兩種實現方式?2、虛擬函式與純虛擬函式的區別,如何使用這兩種方式?3、介面和抽象類的關係?由這兩個問題開始深入的理解一下虛擬函式,純虛擬函式以及抽象類和介面之間的關係。 虛擬函式 百度定義:簡單地說,那
C++語言特性?虛擬函式與純虛擬函式的作用與區別?
一、C++語言的特性有哪些? 1、封裝 封裝就是將抽象得到的資料行為(或功能)相結合,形成一個有機的整體,也就是將資料與操作資料的函式程式碼進行有機地結合,形成類,其中的資料和函式都是類的組成部分,稱為類的成員。 2、繼承 繼承是從先輩處得到的屬性和行為特徵。類的繼承,是新
一個例子徹底搞懂c++虛擬函式和純虛擬函式
學習C++的多型性,你必然聽過虛擬函式的概念,你必然知道有關她的種種語法,但你未必瞭解她為什麼要那樣做,未必瞭解她種種行為背後的所思所想。深知你不想在流於表面語法上的蜻蜓點水似是而非,今天我們就一起來揭開擋在你和虛擬函式(女神)之間的這一層窗戶紙。 首先,我們要