c 問題 問一下下面這段程式為什麼會是這個結果,詳細的在下面

2022-05-31 02:21:33 字數 2791 閱讀 3411

1樓:

你好問題一:new的意思是申請一塊空間,按照指定型別初始化(這裡就是b),並返回其指標,而初始化子類的過程是先初始化父類再初始化子類。而這邊指標被定義為a型別。

由於b是a的子類,實際上b的記憶體空間是這樣的:a:【blabla1】b:

【blabla1(和a一樣的)】blabla2(b自己的)】,指向b的a類指標可以直接當a類來用(沒有虛擬函式的情況下)。此處p被定義為a類指標,所以析構時只會呼叫a的解構函式。ps:

其實我第一眼看的時候覺得奇怪的就是怎麼會只呼叫了a的解構函式,後來發現p是a類指標。

問題二:這是c++多型性一個很好的體現,建議再好好看一下書,我大概講一下。本來一個函式如果如果不寫成虛擬函式,子類中過載該函式時(析構比較特別,雖然名字不同,但是可以看成一種過載),在編譯器能確認此時你是在呼叫哪個時,會呼叫對應的函式,若無法確定,則會呼叫父類的函式(感覺就像過載無效了)。

用了虛擬函式就始終和該變數的型別直接相關,是子類物件就會始終呼叫子類的函式,具體原因說起來挺麻煩,不過很重要,建議自行搜尋「虛擬函式表」進行進一步瞭解。這裡沒有將a定義為虛擬函式時,delete p就只會呼叫a的解構函式,因為p被指定了為a類指標。若將析構定義為虛擬函式,因為p指向的空間是b類的空間,所以會呼叫b的解構函式。

建議仔細理解下面的例子:

#include

using namespace std;

class a

~a()

void func() //加個virtual再試試};class b : public a

~b()

void func()

};void func(a &a)

int main()

ps:希望注意點**風格,不知道是不是排版的問題,感覺樓主的**風格不是非常好,這會在以後**量大時影響可讀性。至於較好的**風格建議看《c++primer》

2樓:匿名使用者

a 類是基類,b 類是派生類,它們存在繼承關係。

一、當你建立派生類(即 b 類)物件的時,將會通過 b 類的建構函式呼叫基類(即 a 類)的建構函式)。

二、當通過指向物件的基類指標刪除派生類物件時,程式將首先呼叫派生類的解構函式,然後再呼叫基類的解構函式。

virtual 函式不能被呼叫?我想你一定是把它和其它的概念混淆。virtual 函式是可以被呼叫的。

c++問題:下面這個程式當中,結果為什麼是4和2,各位能幫我詳細的解釋這個程式每一段**都是什麼意思嗎?

3樓:磚頭

學習一下c語言的函式呼叫吧。譚浩強的書看過了應該自己也能明白#include "iostream.h" //引用標準輸入輸出庫int max(int a,int b,int c);

int min(int a,int b,int c);

void output(int a);

int main()

int max(int a,int b,int c) //a,b,c比大小,返回最大的

int min(int a,int b,int c) //abc比較,返回最小的

void output(int a) //列印a,帶回車

4樓:

#include "iostream.h"

int max(int a,int b,int c); //函式宣告,求abc這三個數中的最大值

int min(int a,int b,int c); //宣告,求最小值

void output(int a); //宣告,輸出a的值

int main() //主函式

int max(int a,int b,int c) //函式定義

int min(int a,int b,int c) //函式定義

void output(int a) //函式定義

5樓:匿名使用者

先執行max(3,4,2)

if (a>=b && a>=c) return a; 不成立if (b>=a && b>=c) return b;成立,返回4return c; 不執行

min(3,4,2)

if (a<=b && a<=c) return a; 不成立if (b<=a && b<=c) return b; 不成立返回c即2

所以輸出4和2

6樓:匿名使用者

@磚頭88 說的那樣

c++程式問題:cin.read()函式在這段程式裡什麼意思?

7樓:匿名使用者

就是「讀入」的意思,把資料讀入資料流中

8樓:_日影月痕

當你輸入2回車時,輸入緩衝區中資料為2和回車,cin>>a;從緩衝區中讀出2,此時回車仍然在緩衝區中,當你再次輸入bcdefghaijklmnopqrst回車後,緩衝區為「回車bcdefghaijklmnopqrst回車」;

cin.get(p,10,'a');這一句命令會從緩衝區讀取最多10個字元或者讀取到字元'a'停止,所以這一句執行後p = 回車bcdefgh,緩衝區為」aijklmnopqrst回車「;

執行第9、10行的輸出為:

2(回車即\n,識別為一個空行)

bcdefgh

cin.read(p,4);從當前緩衝區讀取4個字元(aijk)到p,而且會覆蓋p初始的前4個字元(回車bcd),即,此時p = aijkefgh;緩衝區為lmnopqrst回車;

再次輸出p即為輸出:

aijkfgh

看一下下面這段VB程式的作用

如果過程的級別變數是用 static 關鍵字來宣告的,則只要 正在任何模組中執行,此變數仍會保留它的值。而當所有的 都完成執行後,變數會失去它的範圍和它的值。如果過程中用 dim 宣告變數,則當該過程的 完成執行後,變數就會失去它的範圍和它的值。你的給出過程只是用來判斷敲回車鍵的,模組中肯定還有其它...

c語言求幫忙解釋一下下面這個程式片段

int b 2 int x,y x a y b x x 1 x y x x 1 printf d,d a,b x是指bai向a的指標du,y是指向b的指標,則 x x 1 相當於 zhidaoa a 1 x y 更改內x為指向b的指標 x x 1 相當於b b 1 那麼結果呼之 容欲出2 3 就你的...

那位高手幫我翻譯一下下面這段文字

from the aspect of talents,regime,service and consciousness,the article expounds that yichang no.1 hospital in hubei provice integrates cultural const...