91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中幾個值得分析的小問題是哪些

發布時間:2021-10-29 18:29:46 來源:億速云 閱讀:127 作者:柒染 欄目:編程語言

C++中幾個值得分析的小問題是哪些,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

下面3個小問題都是我認為C++ Beginner應該能夠解答或辨別清楚的。希望我們能通過題目挖掘更多的信息,而不僅僅局限在解題。我最喜歡說的話:能力有限,所以作為拋磚引玉,希望共同討論,指出錯誤。

C++中幾個值得分析的小問題是哪些

另外,我都是碰到一個覺得有必要記錄的問題,就寫下來說說,所以每一篇內容可能不是單一主題。

1、先來看一道簡單題目。有下面這個繼承類:

class Person { public: void Walk() //普通人的“走” { cout << "Person::Walk I am an Ordinary People." << endl; }; };  class Student : public Person { public: void Walk() //學生的“走” { cout << "Student::Walk I am a student." << endl; }; };

你沒看錯Walk()是非虛函數。請解釋下面代碼:

Student s; Person* pp = &s; pp->Walk();  Student* ps= &s; ps->Walk();

結果是這樣的:

C++中幾個值得分析的小問題是哪些

分析:Walk()是非虛函數,被靜態綁定所限制,所以pp、ps是什么類型就決定了調用的版本。這里,我還要說明的一點是:明白接口繼承和實現繼承。聲明一個non-virtual函數的目的是為了令derived class繼承函數的接口及一份強制性實現。所以,絕不要重新定義繼承而來的non-virtual函數。

2、下面這個問題實質上也是靜態綁定與動態綁定的問題,但看起來不那么明顯。

class Shape { public: enum ShapeColor{Red, Green, Blue}; //形狀顏色  virtual void Draw(ShapeColor color = Red) const = 0; };  class Circle : public Shape { public: virtual void Draw(ShapeColor color) const { cout << "I am Circle::Draw. "; cout << "My color = " << color << endl; } };  class Rectangle : public Shape { public: virtual void Draw(ShapeColor color = Green) const //缺省的參數值被更改了 { cout << "I am Rectangle::Draw. "; cout << "My color = " << color << endl; } };

我主要想說兩個問題。

(1)當你下面這樣調用時,請解釋會發生什么情況。

Circle cr; //(1) 編譯不通過 cr.Draw(); Shape *ps = &cr; //(2) ps->Draw();

沒錯,(1)通過對象調用而不指定參數是錯誤的,而(2)的結果是這樣的:color = 0代表Red這你應該是知道的。

C++中幾個值得分析的小問題是哪些

分析:通過對象調用是靜態綁定,一定要指定參數值,因為靜態綁定這個函數不從base class繼承缺省參數值。動態綁定卻可以從base class繼承參數值。注意,這里我就不強調動態綁定和靜態綁定的概念了,但下面這個一定是靜態綁定:

Circle cr; Circle *ps = &cr; //這還是靜態綁定,靜態類型Circle *,編譯不通過 ps->Draw();

(2)第二個我想說的問題,請解釋下面的調用結果。

Shape* ps1 = new Rectangle; ps1->Draw(); Shape* ps2 = new Circle; ps2->Draw();

是這樣令人可喜的結果:

你是說,你在Rectangle中已經將Draw的缺省值改為1(Green)了,怎么沒效果?

分析:Rectangle::Draw的缺省參數值為GREEN,但ps2的靜態類型為Shape*,所以此調用的缺省參數值來自Shape class。

如果你非要讓Rectangle::Draw的參數有所改變,可以這樣調用(提供參數):

Shape* ps4 = new Rectangle; ps4->Draw(Shape::Green); Shape* ps5 = new Circle; ps5->Draw(Shape::Green);

這個問題是想提醒你:virtual函數是動態綁定,缺省參數值是靜態綁定。所以,不應該重新定義這個缺省參數值。

3、多重繼承為什么會含有多個虛表指針而不是一個?

這道題是我看一位同學面試經驗時,面試官提的,我試著回答一下,不知道在不在點子上,還請補充和指正。

答:多重繼承下,因為編譯器對一個derived class實現了n-1個虛表,n表示上一層base class的個數,當然假設每個base class都有至少有一個virtual函數,否則編譯器是不會為其添加vptr和vtbl了。所以說有多少個虛表,自然就有多少個指針指向,而不是一個。

這樣說我不知道合理不合理,可能面試官要問的點是“為什么需要多個虛表?一個虛表行不行?”

這個屬于編譯器廠商做的事情,標準并未規范。C++的父親就做出過這樣的一款編譯器原型,通過增大vtbl的體積,每個slot上不只有一個指針,還有一個offset,用來調整this指針的指向。

這樣做的弊端是:所有vtbl中的虛函數指針都包含這樣一個offset,并且假設不需要調整this指向,調用時還是要做offset的加法操作,盡管offset此時為0。另外,vtbl中每個slot體積的膨脹。這些都是效率問題。

實際上,用來調整this的指向用的比較多的是trunk技術,必須以匯編編寫才能獲得高效率。另外,sun編譯器就是把多個虛表連鎖為1個,每個表格中含有下一個表格的指針(通過offset方式),這樣就需要一個指針就好了。

理解能力有限,不知道問的是不是這么一回事?

關于C++中幾個值得分析的小問題是哪些問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

百色市| 盐边县| 任丘市| 北票市| 西丰县| 彰化县| 古蔺县| 元朗区| 华容县| 英超| 商河县| 军事| 乌审旗| 枣庄市| 南雄市| 镇巴县| 且末县| 通渭县| 白朗县| 康定县| 叙永县| 赤壁市| 武宁县| 常州市| 邵阳县| 寿阳县| 谢通门县| 陆川县| 万荣县| 文山县| 通许县| 江源县| 张掖市| 平舆县| 苗栗县| 天台县| 玛多县| 乌兰察布市| 武鸣县| 迭部县| 威信县|