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 執行一下看看結果,喲呵,驀然...