《深度探索C++物件模型》讀書筆記(5)

來源:互聯網
上載者:User

***純虛擬函數***

在設計抽象基類時,需要注意以下幾點:

(1)不要將destructor 聲明為pure virtual function;

如果將destructor聲明為pure virtual function,則設計者一 定得定義它。因為每一個derived class destructor會被編譯器加以擴充,以靜態調用得方式調用其 “每一個virtual base class”以及“上一層base class”的 destructor.

(2)不要將那些函數定義內容並不與類型有關的函數設計為virtual function,因 為其幾乎不會被後繼的derived class改寫。

(3)對於其derived class可能修改某一個data member的函數,不應被聲明為const.

***“無繼承”情況下的物件建構***

先 定義class Point:

class Point {
public:
Point(float x = 0.0, float y = 0.0) : _x(x),_y(y) {}
virtual float z();
protected:
float _x,_y;
};

你可不能小看z()這個virtual function給class Point帶來的巨大變化。virtual function的引入促使每一個class Point擁有一個vtpr,這樣一來,編譯器在constructor中添加了對 vptr進行初始化的代碼,而copy constructor和copy assignment operator也會對vptr進行設定,而不 再是原先簡單的bitwise操作了。

請看以下的代碼:

Point foobar()
{
Point local;
Point *heap = new Point;
*heap = local;
delete heap;
return local;
}

將被內部轉化為:

Point foobar(Point &_result)
{
Point local;
local.Point::Point();
Point *heap = _new (sizeof(Point));
if(heap != 0)
heap->Point::Point();
*heap = local;
_result.Point::Point(local);  // copy constructor的應用
local.Point::~Point();
return;
}

從以上代碼的轉化可以看出:一般而言,如果你的設計之中有很多函 數都需要以傳值方式(by value)傳回一個local class object,那麼提供一個copy constructor就比 較合理。

***繼承體系下的物件建構***

假設class Point3d虛擬繼承於class Point,但 由於class Point僅存在一份實體,因而class Point3d的constructor需要注意一個問題。

請看下面的繼承關係圖:

class Point3d : virtual public Point { ... };
class Vertex : virtual public Point { ... };
class Vertex3d : public Point3d, public Vertex { ... };

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.