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樓:匿名使用者
你可以定義純虛擬函式,這部需要實現
c繼承父類的子類如何呼叫父類的同名函式
子類呼叫父類的同名函式 子類和父類返回值引數相同,函式名相同,有回virtual關鍵字,則由答物件的型別決定呼叫哪個函式。子類和父類只要函式名相同,沒有virtual關鍵字,則子類的物件沒有辦法呼叫到父類的同名函式,父類的同名函式被隱藏了,也可以強制呼叫父類的同名函式class funtion na...
C 的虛擬函式有什麼用呢,C 中虛擬函式的作用是什麼?它應該怎麼用呢?
主要用在繼承抄與多型上 比如有一個襲汽車類,它有bai一個虛du函式alarm 就是鳴笛的聲zhi 音。汽車類有很多子 dao類,比如卡車類,小轎車類,他們的鳴笛聲音都一樣,所以只需繼承汽車類,不用在每個類裡重寫這個函式。現在如果新增一個卡丁車類,它的鳴笛聲音和其他類都不一樣,那就可以在這個類裡重寫...
c 中解構函式中可以呼叫虛擬函式麼
c 中 解構函式中不可以呼叫虛擬函式。effective c 中有這樣的描述 同樣的原因也適用於析構過程。一旦派生類解構函式執行,這個物件的派生類資料成員就被視為未定義的值,所以 c 就將它們視為不再存在。c 中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類的...