動態繫結為什麼必須要通過指標或引用呼叫虛擬函式

2022-03-26 09:15:20 字數 3306 閱讀 8479

1樓:匿名使用者

因為物件的型別是確定,在編譯期就確定了

指標或引用是在執行期根據他們繫結的具體物件確定

2樓:逍遙鼠一世

動態繫結是將一個過程呼叫與相應**連結起來的行為。是指與給定的過程呼叫相關聯的**,只有在執行期才可知的一種繫結,他是多型實現的具體形式。

實現原理:

c++中,通過基類的引用或指標呼叫虛擬函式時,發生動態繫結。引用(或指標)既可以指向基類物件也可以指向派生類物件,這一事實是動態繫結的關鍵。用引用(或指標)呼叫的虛擬函式在執行時確定,被呼叫的函式是引用(或指標)所指物件的實際型別所定義的。

c++中動態繫結是通過虛擬函式實現的。而虛擬函式是通過一張虛擬函式表(virtual table)實現的。這個表中記錄了虛擬函式的地址,解決繼承、覆蓋的問題,保證動態繫結時能夠根據物件的實際型別呼叫正確的函式。

在c++的標準規格說明書中說到,編譯器必需要保證虛擬函式表的指標存在於物件例項中最前面的位置(這是為了保證正確取到虛擬函式的偏移量)。這意味著我們通過物件例項的地址得到這張虛擬函式表,然後就可以遍歷其中函式指標,並呼叫相應的函式。

為什麼說c++的虛擬函式是動態繫結

3樓:匿名使用者

因為虛擬函式是在呼叫時才確定的,其他則是編譯時確定的

4樓:匿名使用者

虛擬函式機制起作用時,必然是通過指標或引用方式去呼叫虛擬函式,c++語法規定指標和引用的型別是基類時,可以指向派生類,所以執行時傳引數進來一個派生類物件,這時就由執行時進行決議的,即動態判定,當然如果是一個積極的編譯器,那麼對那種編譯期就能確定所指向的物件是誰時,可以做到靜態繫結。具體可以看看虛擬函式機制在編譯器中是如何實現的。

派生類定義虛擬函式,通過基類指標呼叫為什麼不行

5樓:空雪夢見

因為pt的型別是指向a的指標

而a裡沒有test。

這種基於虛表的多型要求指標的型別裡也要有這個函式才行。

6樓:名字短了會重名

基類指標不是隻能呼叫派生類繼承的自己的非static成員?

只有通過物件指標和引用呼叫虛擬函式才能產生多型

7樓:匿名使用者

多型主要有兩種方法實現:

基類的指標加上虛擬函式;

基類的引用加上虛擬函式。

也就是說可以用引用實現多型,但是都必須使用虛擬函式。

為什麼c++中只有指標和引用才能實現多型

8樓:他不想取名字

引用也可以,不過值傳遞不行,值傳遞要帶來拷貝構造,丟失型別資訊。

引用和指標都是一個本尊

c++中用父類指標指向子類例項,用父類指標呼叫虛擬函式,問呼叫的是子類的函式還是父類的函式,為何?

9樓:匿名使用者

因為你題目硬指明已經定義為虛擬函式,所以,指向哪個子類例項,就呼叫哪個子類的函式。

這個過程一般稱為動態聯編

10樓:匿名使用者

你這個應該是呼叫的子類的函式,原因如下:

如果是虛擬函式,是可以通過基類的指標呼叫子類的函式的。

如果不是虛擬函式基類指標就只能呼叫基類函式

建構函式可以呼叫虛擬函式嗎?語法上通過嗎

11樓:匿名使用者

c++是不允許虛建構函式。

測試**:

class a

private:

int x;

};int main()

錯誤資訊:error c2633: 'a' : 'inline' is the only legal storage class for constructors

我就去找了一下為什麼。下面是找到的一點資訊。

虛建構函式是有用的,最常見的情況就是持久化支援。將物件從持久化源中取出來就非常需要一種類似虛建構函式的機制。事實上我們通常用設計模式來做到這一點,那就是abstract factory。

c++不支援虛建構函式的原因說來既簡單又複雜:

1、簡單的說,c++中沒有實現虛建構函式的簡單方法。實現虛建構函式必然要依賴於某種執行時反射機制,而c++只有最弱的rtti機制,實現這種反射需要付出的代價相當昂貴,從速度到空間都有。

2、複雜的說,虛建構函式與c++的現有體系是非自諧的。雖然c++基本上是一個實用主義語言,自諧從來不是它的目標,比如與c的相容性就非常影響它的自諧性,但一個與整個體系的方向相背離的特性對整個語言是一種嚴重的傷害。所謂違背自諧,簡單的理解就是,它會影響已有的特性。

c++之父已經說過,「虛擬」建構函式,可以輕易繞過去。

在建構函式裡,呼叫一個虛擬函式來執行真正的初始化動作即可。

虛擬函式是動態繫結的,也就是說,使用虛擬函式的指標和引用能夠正確找到實際類的對應函式,而不是執行定義類的函式。

建構函式不能是虛擬函式。而且,在建構函式中呼叫虛擬函式,實際執行的是父類的對應函式,因為自己還沒有構造好, 多型是被disable的。

另外,解構函式允許為虛並且往往是必要的。

12樓:琉璃易碎

可以,但最好不要這樣用

在建構函式中呼叫虛成員函式,雖然這是個不很常用的技術,但研究一下可以加深對虛擬函式機制及物件構造過程的理解。這個問題也和一般直觀上的認識有所差異。先看看下面的兩個類定義。

struct c180

virtual foo() };

struct c190 : public c180

virtual foo() };

父類中有一個虛擬函式,並且父類在它的建構函式中呼叫了這個虛擬函式,呼叫時它採用了兩種方法一種是直接呼叫,一種是通過this指標呼叫。同時子類又重寫了這個虛擬函式。

我們可以來**一下如果構造一個c190的物件會發生什麼情況。

我們知道,在構造一個物件時,過程是這樣的:

1) 首先會按物件的大小得到一塊記憶體(在heap上或在stack上),

2) 把指向這塊記憶體的指標做為this指標來呼叫類的建構函式,對這塊記憶體進行初始化。

3) 如果物件有父類就會先呼叫父類的建構函式(並依次遞迴),如果有多個父類(多重繼承)會依次對父類的建構函式進行呼叫,並會適當的調整this指標的位置。在呼叫完所有的父類的建構函式後,再執行自己的**。

照上面的分析構造c190時也會呼叫c180的建構函式,這時在c180建構函式中的第一個foo呼叫為靜態繫結,會呼叫到c180::foo()函式。第二個foo呼叫是通過指標呼叫的,這時多型行為會發生,應該呼叫的是c190::

foo()函式。

家庭為什麼必須要理財,一個家庭為什麼必須要理財

家庭理財計劃可使家庭財政處於一個比較寬鬆的環境之下,並能夠確保家庭理財重點,兼顧其他方面,從而使家庭處於一種積極的穩步上升,成長,健康發展的狀態。家庭理財的計劃性可以使家庭成員養成一種良好的理財習慣,從而有助於學習和工作。家庭理財計劃可避免家庭中財政空缺的隱患,便於家庭及時對症下藥,及時採取措施,從...

寶寶必須要換奶粉嗎?有什麼利與弊?懂得大神指點一二

我感覺只要寶寶喝的好,不需要換奶粉啊,經常換的話,寶寶也不適應,甚至有時還會拉肚子。我感覺只要寶寶喝的好,不需要換奶粉啊,經常換的話,寶寶也不適應,甚至有時還會拉肚子。什麼情況下要換奶粉?如果母乳充足的情況下儘量選擇母乳餵養,因為母乳含有奶粉所沒有的營養物質。還可以提供寶寶免疫蛋白。沒什麼問題不需要...

為什麼有生必有死,為什麼人必須要死?

生命的本質是機體內同化 異化過程這一對矛盾的不斷運動 而死亡則是這一對矛盾的終止.人體內各組織器官的同化 異化過程的正常進行,首先需要呼吸 迴圈系統供給足夠的氧氣和原料,尤其是中樞神經系統耐受缺血缺氧的能力極差,所以一旦呼吸 心跳停止,可以立即引起死亡.所謂復甦也就是先用人工的方法代替呼吸 迴圈系統...