C 學習(9)(虛擬繼承虛函式)

2021-10-06 12:42:35 字數 1450 閱讀 5376

虛函式在類的多層繼承時,如果中間類繼承了同乙個基類,那派生類就會繼承兩套基類,產生二義性。

同時,虛擬繼承時,派生類要給出虛基類的構造。

#include//虛擬繼承

using namespace std;

class person

~person(){}

string getname()

void setname(string name)

};class student : virtual public person

~student(){}

};class employee : virtual public person

~employee(){}

};class stuemployee : public student,public employee

~stuemployee(){}

};//2.只在中間類加virtual而派生類不完成基類構造會報錯

//error: no matching function for call to 'person::person()'|

int main()

{ stuemployee se("shi","201801120926","31415926");

//1.沒寫virtual時,下面第一句會報錯,因為繼承了兩套person

/*cout<1.同一層同時繼承和虛擬繼承,先完成虛基類的構造,再完成其他基類的構造

2.派生類的一次構造中,只構造每個虛基類一次。

派生類物件可賦值給基類物件,派生類位址值可賦給基類指標,派生類可賦值給基類引用

(後浪推前浪)

這導致基類只能訪問派生類繼承基類的成員,不能訪問派生類自定義的成員,為了解決這個問題,使用虛函式

在基類成員函式前加virtual,那麼基類物件就可以訪問派生類物件的新加入的成員或者重寫的繼承成員方法。

1、一旦將某個成員函式宣告為虛函式後,它在類的繼承體系中就永遠為虛函式了。

2、如果基類定義了虛函式,當通過基類指標或引用呼叫派生類物件時,將訪問到它們實際所指物件中的虛函式版本。

3、只有通過基類物件的指標和引用訪問派生類物件的虛函式時,才能體現虛函式的特性。

4、派生類中的虛函式要保持其虛特徵,必須與基類虛函式的函式原型完全相同,否則就是普通的過載函式,與基類的虛函式無關。(判斷函式相同:返回值相同,形參列表相同,函式名相同,相同即為重寫)

5、派生類通過從基類繼承的成員函式呼叫虛函式時,將訪問到派生類中的版本。

6、只有類的非靜態成員函式才能被定義為虛函式,類的建構函式和靜態成員函式不能定義為虛函式。原因是虛函式在繼承層次結構中才能夠發生作用,而建構函式、靜態成員是不能夠被繼承的。

7、內聯函式也不能是虛函式。因為內聯函式採用的是靜態聯編的方式,而虛函式是在程式執行時才與具體函式動態繫結的,採用的是動態聯編的方式,即使虛函式在類體內被定義,c++編譯器也將它視為非內聯函式。

虛擬繼承 虛函式,含有虛函式的菱形虛擬繼承

一 虛擬繼承 虛函式 場景 派生類沒有自己的虛函式,只是繼承基類的虛函式 我們看乙個例子 class base virtual void funtest2 int b class derived virtual public base virtual void funtest2 int d type...

虛函式和虛擬繼承

什麼是虛函式,我想如果你能馬上用口頭表達出來,那麼你的基礎不錯。知道虛函式表嗎?也許你已經看了很多書,了然於胸。其實很多時候並不需要看書,就可以體會到。然後什麼是虛擬繼承?也許聽說過,但很少使用。其實使用虛擬繼承,可以減輕你很多的痛苦。看下面乙個例子 這裡的例子盡可能的簡單,關於虛函式。class ...

虛基類 虛擬繼承 虛函式?

前幾天師兄想考我什麼是虛基類的時候,我說是因為多重繼承中,如果出現菱形繼承 multiple inheritance diamond 不想要末端派生類有兩份最底層基類的資料的話,就得用虛擬繼承。結果居然被懟了,說我說的啥玩意兒?我還以為我記錯了,實際上是他把虛基類和含有虛函式的基類給混淆了。今天讀了...