深入剖析C++繼承,多態以及隱藏(三)(類層次中的轉化問題)

一,C++幾個特殊函數;

1,在定義一個類的時候,如果程序員沒有顯示的定義一下幾個東西的話,編譯器會自動爲你生成以下的幾個成員;

1)缺省構造函數.(無參)

2)拷貝構造函數

3)賦值運算符.

4)取地址運算。

5)析構函數

也就是說你定義一個class Empty(){};

跟你定義一個

class Empty{
public:
   Empty();                         // 缺省構造函數
   Empty(const Empty& rhs);         // 拷貝構造函數

   ~Empty();                        // 析構函數 ---- 是否
                                   // 爲虛函數看下文說明
   Empty&
   operator=(const Empty& rhs);     // 賦值運算符

   Empty* operator&();              // 取址運算符
   const Empty* operator&() const;
};
是一樣的。

2,這樣也就決定了幾個問題:

1)在繼承的過程中,構造函數,析構函數,賦值運算符,拷貝構造函數不會被繼承。

2)如果在派生類中沒有顯示的定義,編譯器會爲你做初始的定義!


二,類層次中的向上向下類型轉化;

1,層次中對指針或者是引用進行類型的向上轉化是安全的也不需要顯示的轉化,這也是虛函數實現動態的一個方法!

2,層次中如果使用對象來直接進行類型的向上轉化的話,那麼將會發生"對象切片"的問題。
也就是說最後轉化後的對象只保留上一個層次中所能擁有的接口!

3,層次中向下類型轉化,是不確定也不是安全的。也是需要顯示才能作出轉化的。通常的話有兩種轉化方式,一種是

dynamic_cast<Derived*>(base*);
另外一種是靜態的轉化: static_cast<Derived* >(base*);
顯然靜態的轉化所需要的空間以及系統資源較少,但是動態的較多;
所以在可以確定轉化的類型的時候,可以配合RTTI(run-time-type-information)來使用靜態轉化。

當然如果不知道確定類型的話,更爲安全的用法當然是動態轉化!

三,雜七雜八;

1,new和delete的配對使用。

其中的配對使用不僅僅說明了有多少個new操作就必須做多少個delete操作;這個對於先學習java語言或者是c#語言而後來學C++語言的人是特別要
注意的!
千萬不能忘記delete。否則memory leak就會不知不覺的發生!

2,其次new和delete的形式必須相同!
也就是說new的是個指針指向的是單一對象還是[]指向數組;

那麼delete也必須相對應的delete相應的內容!(加還是不加[])


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/slowboy1990/archive/2008/11/21/3345113.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章