c中派生類重寫基類虛函式的問題望大蝦指教

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

1樓:

非也,子類不能直接呼叫父類的成員函式以及成員變數,如果要呼叫就必須用父類::

也就是你這個函式中其實呼叫的是父類的函式,這個與虛函式沒有一點關係,僅僅是子類呼叫父類的方式而已。

虛函式的價值體現是

我定義乙個子子類物件 :cclientsocket ccs; // 假設有無參建構函式

然後我定義了乙個其他的函式:

exec(casyncsocket * p) //特別注意這裡是父類的指標

答案是子類的,這就是虛函式機制了,當我們定義乙個子類物件,而用父類的指標呼叫虛函式的時候其實執行的是子類的相應函式。

當然你這裡子類函式還是要掉用父類虛函式的,管他掉用哪個呢,反正最開始執行的是子類函式,不是嗎?你可以加上列印資訊除錯下。

2樓:

這是呼叫基類的函式,::是域作用符,在這裡表示呼叫casyncsocket類的函式onreceive();

因為一般重寫這些虛函式只是新增少部分自己的事件,其餘的還是會發給基類來處理,所以這裡面加上這呼叫基類的方法

3樓:嗜血獠牙

::是在類外定義函式用的,因為onreceive是casyncsocket的乙個虛函式,而cclientsocket是casyncsocket的派生類,所以onreceive在cclientsocket中也是虛函式,只不過沒寫上virtual 而已

關於c++派生類中虛函式的問題

4樓:匿名使用者

如果是虛函式的話,在派生類中重新定義其函式體時,不會導致同名覆蓋.當用基類指標指向派生類物件並呼叫虛函式時,執行的是在派生類中重新定義的虛函式的函式體.

5樓:匿名使用者

虛函式必須要在基類用virtual修飾才能為虛函式,派生類若重定義該函專數,則無論是否有屬virtual關鍵字都是虛函式。你要判斷派生類中沒有用virtual定義的函式是否為虛函式,則可以:在該函式標誌特定的輸出,如cout<<"virtual function!

";然後定義乙個基類的指標bp,指向新new的派生類物件,然後用bp呼叫所需判斷的函式,看是否有輸出特定的標誌virtual function!,如果正確輸出則說明是虛函式,其他情況則表明該函式不是虛函式。

6樓:匿名使用者

一旦乙個函式被宣告為虛函式,那麼他從該點之後的繼承層次結構中都是虛函式,不管它在有

版沒有再次聲

權明是不是虛函式,有些程式設計師為了提高程式的清晰度,在繼承結構中喜歡再次明確的宣告這些虛函式.

至於「判定覆蓋的依據是兩者都是虛函式,發生在派生類與基類之間。」只是解釋了什麼是覆蓋,派生類將基類中的虛函式重寫即為覆蓋。

7樓:匿名使用者

想用虛函式是:基類、父類都要定義成virtual型別的

8樓:檀木妍

比如b是乙個派生類,f是b裡面乙個函式。

先去b的基類裡找,如果發現f原來在某個基類中有的專,看基類中f是不是虛函屬

數,如果是,那不管b中f有沒有virtual都是虛函式。

如果在基類中沒有發現f的原型,則就看b中f自己有沒有virtual了,有就是,沒有就不是。

9樓:匿名使用者

虛幻數必須要用上virtual!!你那本書喜歡玩文字遊戲!!是不是出自 天回 朝 的?!試試下面**,你就

答能領悟如何判斷是否用了虛幻數:

//虛函式的特性如下!!

#include "stdafx.h"

#include

using namespace std;

class a

};class b: public a};//由於此處引數定義的原因,show(b);效果與(*aa).a();一樣。

void show(a &a)

void main()

c++:派生類中重定義基類的成員函式與虛函式區別在**?

10樓:匿名使用者

1、c++的虛函式主要是為了實現多型。基類定義的虛函式,派生類重新定義該函式,這樣基類物件指標呼叫哪乙個函式是判斷該基類指標的物件的型別。

2、虛函式用virtual關鍵字修飾,同時開啟動態聯編技術,動態聯編只有程式執行時才能確定呼叫的函式,在編譯階段是不知道要呼叫哪乙個函式。

11樓:匿名使用者

如果加關鍵字 virtual,則是 override;

如果不加關鍵字 virtual,則跟作用域有關,基類與派生類的成員函式作用域不相同。

c++中基類指標指向派生類時,呼叫的虛函式是派生類的,為什麼要這樣啊?

12樓:

直接用子類物件呼叫函式當然沒問題,基類指標指向派生類物件是多型性的體現。

什麼是多型呢?多型就是不同物件接受相同的訊息,但是卻產生不同的行為,舉乙個很簡單的例子,有乙個圖形類,他有幾個派生類,如圓形,三角形,矩形。圖形類有乙個函式area();用來求面積,但是由於不同圖形求面積的方法不同,要由具體的派生類來決定,所以可以把它定義為乙個虛函式,由派生類來過載這個函式,所以不同的派生類裡面area()函式的函式體是不同的,

建立乙個基類指標*p,讓他指向不同的派生類物件,p在呼叫area()方法時,就會呼叫派生類的area()方法了。

多型的乙個好處就是提高了**的重用性,如果圖形類又有乙個新的派生類五邊形,要求他的面積只需要把剛才的p指標再指向乙個五邊形物件,而其他的**無需任何更改!

在附上例子吧!

class shape

class circle: public shape

}class ********: public shape

}class rectangle: public shape

}int main()

只是大概意思,供參考。

13樓:

虛函式的作用是: 在呼叫函式時再確定呼叫哪個物件的函式.

如果物件是被初始化為子類的, 就呼叫子類的函式; 如果物件是被初始化為父類的, 就呼叫父類的函式.

14樓:匿名使用者

直接用派生類的物件是可以的。但是虛函式的作用體現在多型上。

比如類a是個基類,類b,c,d由類a繼承。

現在我要寫個函式func1,對bcd三個類的物件都通用,函式內部呼叫bcd三個類都有的乙個函式func2。

但是bcd三個類是不同的類,那麼這個函式可能就要過載三次,寫成func1(b b);

func1(c c);

func1(d d);

這樣才能區分傳進去的是哪個類的物件在呼叫func2,這樣在繼承得多了的時候顯得很麻煩。虛函式多型就可以解決這樣的問題。

把func2在類a中定義成虛函式,然後只要寫乙個func1func1(a *a);

此時傳b *b,c *c,d *d三個指標物件進去,都可以相應的呼叫各自的func2了。這是物件導向思想的乙個體現

在派生類中重新定義虛函式時,除了( )方面,其他方面都必須與基類中相應的虛函式保持一致。

15樓:匿名使用者

d基類中的虛函式可以不做任何事的,在派生類中重新定義虛函式,即具體操作交給派生類。

16樓:匿名使用者

操作內容 。

只有操作內容可以不一樣,而引數型別,函式型別,引數個數均要一樣。

C 中派生類的建構函式怎麼顯式呼叫基類建構函式

子類構造的時候會自動呼叫基類的建構函式 並且是有順序的呼叫完建構函式的順序 基類 子類 子子類 不僅建構函式 析構函式也這樣 子類物件析構時自動呼叫基類的析構函式順序與建構函式順序相反 子類.基類 關於顯示呼叫基類的建構函式,是不可行的。必須用初始化表的形式呼叫基類建構函式,才能正確的把子類繼承下來...

C派生類指標指向基類物件,C 中基類指標指向派生類物件可以呼叫派生類的新增成員麼

需要知道一些常識,乙個類所有的函式都是再code 區中唯一的存放乙份。而資料成員則是每個物件儲存乙份,並按照宣告順序依次存放。類a中有了虛函式就會再類的資料成員的最前面新增乙個vfptr指標 void vfptr 這個指標用來指向乙個vtable表 乙個函式指標陣列 乙個類只有乙個該錶 該錶儲存著當...

關於c基類派生類的引用和指標,關於C 基類 派生類的引用和指標

1 首先回答第一個問題 用基類的指標指向派生類的物件,這樣做可以體現c 的重要特性 多型性。多型性其實也就是動態聯編。這樣做的好處是 當基類裡面定義了一個虛成員函式的時候,其派生類裡面定義了同名的函式可以實現覆蓋。你的基類指標指向那個物件,就呼叫那個物件的該方法。我舉個例子你應該就明白了 class...