c虛擬函式如何調父類而非子類

時間 2021-08-30 10:08:09

1樓:匿名使用者

1,如果以一個基礎類指標指向一個衍生類物件(派生類物件),那麼經由該指標只能訪問基礎類定義的函式(靜態聯翩)

2,如果以一個衍生類指標指向一個基礎類物件,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾。(一般不會這麼去定義)

3,如果基礎類和衍生類定義了相同名稱的成員函式,那麼通過物件指標呼叫成員函式時,到底呼叫那個函式要根據指標的原型來確定,而不是根據指標實際指向的物件型別確定。

虛擬函式就是為了對“如果你以一個基礎類指標指向一個衍生類物件,那麼通過該指標,你只能訪問基礎類定義的成員函式”這條規則反其道而行之的設計。

如果你預期衍生類由可能重新定義一個成員函式,那麼你就把它定義成虛擬函式( virtual )。

polymorphism就是讓處理基礎類別物件的程式**能夠通透的繼續適當地處理衍生類物件。

純虛擬函式:

virtual void myfunc ( ) =0;

純虛擬函式不許定義其具體動作,它的存在只是為了在衍生類鐘被重新定義。只要是擁有純虛擬函式的類,就是抽象類,它們是不能夠被例項化的(只能被繼承)。如果一個繼承類沒有改寫父類中的純虛擬函式,那麼他也是抽象類,也不能被例項化。

抽象類不能被例項化,不過我們可以擁有指向抽象類的指標,以便於操縱各個衍生類。

虛擬函式衍生下去仍然是虛擬函式,而且還可以省略掉關鍵字“virtual”。

看個例子:

#include

using namespace std;

class a

virtual void bar()

};class b: public a

void bar()

};int main()

aptr->foo()輸出結果是:

b's foo()//這個明白,多型性

a's foo()//這個也明白,執行a::foo();

b's bar()//雖然呼叫的是這個函式:a::foo(); 但隱式傳入的還是bobj 的地址,所以再次呼叫bar();呼叫時還是會呼叫b的函式, 與虛擬函式指標有關

aobj.foo()輸出結果是:

a's foo() //這個不是指標,aobj完全是一個a的物件,與多型沒有關係

a's bar()

2樓:

如果是用基類指標的方式,只能將指標指回基類物件,再呼叫,如果不用指標,而直接用物件來呼叫的話,直接就用基類物件來呼叫相應的函式就行

虛擬函式主要是體現在c++多型性上

而實現多型性,就需要基類指標指向基類或者子類物件,

3樓:自由de王國

只要指標指向父類的物件,那呼叫的時候就是父類的成員函式

4樓:匿名使用者

#include

class a ;

};class b : public a};int main ()

c++父類中有純虛擬函式,在子類的子類中也需要實現嗎?

5樓:匿名使用者

(1)在main函式中,假設有父類或者子類的例項物件,就須要有父類的虛擬函式的實內現。

(2)在容main函式中,假設沒有父類或者子類的例項物件,能夠不實現父類的虛擬函式。

(3)假設把虛擬函式寫成純虛擬函式,也就不須要實現了。也沒不會發生上述討論。

子類中實現了,子子類就不用實現。

子類沒實現的話,子子類就可能需要實現。

反正沒有實現這個=0的函式的類是無法建立物件的。

所以要例項化的類就要實現。

6樓:匿名使用者

子類中實現了,子子類就不用實現。。。

子類沒實現的話,子子類就可能需要實現。。。

反正沒有實現這個=0的函式的類是無法建立物件的。。。

所以要例項化的類就要實現,***。。。

c++ 怎樣禁止子類重寫父類的某個虛擬函式?

7樓:匿名使用者

c++11 提供指示字final,用來避免型別被繼承,或是基底型別的函式被改寫

class b:public a

;gcc4.7沒問題,

vs2010好像版不行,不識別權finalvs2012沒有試,需要win7/8

8樓:匿名使用者

不可能的事。

只要在a類中定義sayhello的時候加了virtual,那麼sayhello就永遠是個virtual函式,不管繼承多少層、回加不加virtual。

而子類答怎麼改寫父類的函式,父類完全乾涉不了。所以無法阻止c改寫b的sayhello。

除非你把b類做成一個不允許其他類繼承的類。

c++ 在父類宣告一個純虛擬函式,怎樣在父類建構函式中呼叫子類覆蓋後的該純虛擬函式?

9樓:

不能,就算中bai轉一下也不行,du因為這個zhi時候還虛擬函式表還沒有dao改寫,也就是說版純虛函權

數還沒有實現,函式指標指是空的。這是時序的問題。

執行之後會報這個錯誤:

libc++abi.dylib: pure virtual function called!

[1] 2417 abort ./test而且多數情況下,連編譯期都過不去。

10樓:匿名使用者

建構函式在物件建立時被呼叫,父類都沒建立,他怎麼去呼叫子類的東西,想想你為什麼需要這樣的設計。

11樓:人生做回自己

在父親類的建構函式中不能呼叫子類的虛擬函式的。

c++中父類的虛擬函式必須要實現嗎

12樓:匿名使用者

虛擬函式是自帶實現的,因此派生類中可以選擇實現自己的,也可以直接使用基版類的。

但是純虛擬函式一般權未提供實現,所以派生類基本需要提供實現,但是即使基類提供了預設實現,如果派生類需要進行例項化,那麼派生類還是需要提供實現的。

13樓:匿名使用者

你可以定義純虛擬函式,這部需要實現

虛擬函式virtual的作用,C 中虛擬函式的作用是什麼?它應該怎麼用呢?

文件類共創空間 虛擬函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include usin...

c中子類建構函式中如何呼叫父類建構函式

四捨 入 class a class b a 子類的子類呼叫父類中的隱藏成員 一般情況,在呼叫父類成員時子2代和子1代沒什麼區別。但如果子1代隱藏父類成員,情況就會不同。像上面的情況,son隱藏了父類的成員變數name和成員方法tellname 如果再有乙個類grandson繼承son,那grand...

c 中什麼是虛函式?空虛函式有什麼作用?可以宣告抽象類的對

簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。下面來看一段簡單的 class a 執行一下看看結果,喲呵,驀然...