物件導向——意圖與邏輯(四)

Inside_Zhang發表於2015-11-20

物件導向——意圖與邏輯
物件導向——意圖與邏輯 (二)
物件導向——意圖與邏輯(三)
物件導向——意圖與邏輯(四)

  1. public繼承意味著is a(狗是動物,蘋果是水果,子類是父類)

  2. virtual意味著介面必須被繼承

  3. non-virtual函式意味著介面和實現都必須被繼承

  4. non-pure virtual存在一個預設演算法(或者說父類要提供一個實現)

  5. pure virtual則是完全客製化(customerization)

  6. override (重寫),通俗地理解就是覆蓋(新版本覆蓋舊版本);

觀察一個類,應首先觀察其成員變數,因為大部分類最終表達的仍是一個具有很多成員方法的物件的抽象,也即它是對成員變數,以及圍繞成員變數的成員方法的封裝。

在多類的、類間關係較為複雜時,進行每個類單獨的設計與實現時,腦海中應有一個 UML,它就是建築實施中的圖紙。

虛擬函式不能是靜態函式

虛擬函式(vptr:virtual pointer、vtbl:virtual table)(也包括 this 指標)都是物件(class objects)的概念;

而 static 是全體物件,是類的概念範疇,靜態函式沒有 this 指標;

C++中的get、set方法

首先一點,是類的預設構造函式會分別呼叫類成員變數的預設構造函式。

class Test
{
private:
    std::vector<double> _weights;
public:
    // 有點set方法的感覺
    std::vector<double>& weights() { return _weights;}
    // 而這是get方法
    const std::vector<double>& weights() const { return _weights;}
}

int main(int, char**)
{
    Test t;   // 會呼叫std::vector<double> 的預設建構函式,建立_weights物件例項

    std::vector<double> dvec{0., 1., 2.};
    t.weights() = dvec;        // 在客戶端建立,然後set

    return 0;
}

如果這樣理解還算正確的話,那麼大量見諸於STL容器的兩個版本的(mutable 和 non-mutable)的成員函式的作用便可顯見。

Java/C++ 對多型的支援

Java 動態繫結,C++ 靜態繫結(預設非多型),

這句話翻譯過來即是:
父類引用指向子類物件,父類引用呼叫其子類中重寫的方法時,Java預設多型,C++ 需顯式的宣告該方法為 virtual 虛擬函式。

相關文章