自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[132848]]

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

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

  1. class Person 
  2. public
  3. void Walk() //普通人的“走” 
  4. cout << "Person::Walk I am an Ordinary People." << endl; 
  5. }; 
  6. }; 
  7.  
  8. class Student : public Person 
  9. public
  10. void Walk() //學(xué)生的“走” 
  11. cout << "Student::Walk I am a student." << endl; 
  12. }; 
  13. }; 

 

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

 

  1. Student s; 
  2. Person* pp = &s; 
  3. pp->Walk(); 
  4.  
  5. Student* ps= &s; 
  6. ps->Walk(); 

結(jié)果是這樣的:

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

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

2、下面這個問題實(shí)質(zhì)上也是靜態(tài)綁定與動態(tài)綁定的問題,但看起來不那么明顯。

  1. class Shape 
  2. public
  3. enum ShapeColor{Red, Green, Blue}; //形狀顏色 
  4.  
  5. virtual void Draw(ShapeColor color = Red) const = 0; 
  6. }; 
  7.  
  8. class Circle : public Shape 
  9. public
  10. virtual void Draw(ShapeColor color) const 
  11. cout << "I am Circle::Draw. "
  12. cout << "My color = " << color << endl; 
  13. }; 
  14.  
  15. class Rectangle : public Shape 
  16. public
  17. virtual void Draw(ShapeColor color = Green) const //缺省的參數(shù)值被更改了 
  18. cout << "I am Rectangle::Draw. "
  19. cout << "My color = " << color << endl; 
  20. }; 

 

我主要想說兩個問題。

(1)當(dāng)你下面這樣調(diào)用時(shí),請解釋會發(fā)生什么情況。

 

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

沒錯,(1)通過對象調(diào)用而不指定參數(shù)是錯誤的,而(2)的結(jié)果是這樣的:color = 0代表Red這你應(yīng)該是知道的。

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

分析:通過對象調(diào)用是靜態(tài)綁定,一定要指定參數(shù)值,因?yàn)殪o態(tài)綁定這個函數(shù)不從base class繼承缺省參數(shù)值。動態(tài)綁定卻可以從base class繼承參數(shù)值。注意,這里我就不強(qiáng)調(diào)動態(tài)綁定和靜態(tài)綁定的概念了,但下面這個一定是靜態(tài)綁定:

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

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

 

  1. Shape* ps1 = new Rectangle; 
  2. ps1->Draw(); 
  3. Shape* ps2 = new Circle; 
  4. ps2->Draw(); 

是這樣令人可喜的結(jié)果:

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

分析:Rectangle::Draw的缺省參數(shù)值為GREEN,但ps2的靜態(tài)類型為Shape*,所以此調(diào)用的缺省參數(shù)值來自Shape class。

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

 

  1. Shape* ps4 = new Rectangle; 
  2. ps4->Draw(Shape::Green); 
  3. Shape* ps5 = new Circle; 
  4. ps5->Draw(Shape::Green); 

這個問題是想提醒你:virtual函數(shù)是動態(tài)綁定,缺省參數(shù)值是靜態(tài)綁定。所以,不應(yīng)該重新定義這個缺省參數(shù)值。

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

這道題是我看一位同學(xué)面試經(jīng)驗(yàn)時(shí),面試官提的,我試著回答一下,不知道在不在點(diǎn)子上,還請補(bǔ)充和指正。

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

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

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

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

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

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

責(zé)任編輯:王雪燕 來源: 青藜學(xué)士的博客
相關(guān)推薦

2011-07-04 09:39:31

項(xiàng)目管理

2011-04-11 14:18:37

CC++指針

2024-02-21 14:55:19

C++語言編程

2010-01-13 10:37:55

C++開發(fā)

2024-01-25 11:36:08

C++構(gòu)造函數(shù)關(guān)鍵字

2020-01-14 18:20:48

OA選型CIO

2010-01-21 09:34:57

C++語法

2010-01-27 16:05:06

C++堆棧

2024-02-19 08:07:31

Go版本語言

2009-08-25 15:23:16

C#子線程

2010-01-21 14:07:14

CC++聲明

2010-01-26 10:42:26

C++函數(shù)

2012-02-02 14:34:37

C# Socket

2016-03-22 16:51:13

C++泛型膨脹

2010-01-20 10:19:55

C++數(shù)組

2010-01-28 16:31:54

C++類型

2010-01-21 13:33:44

C++基類

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2010-01-25 10:25:19

C++變量

2020-08-21 13:20:36

C++If ElseLinux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號