第十二章 C 物件導向設計方法概述

2021-07-02 03:38:45 字數 2148 閱讀 5553

繼承: is a   基類a,派生類b,b  is a a!

組合: is a part of    聚合(has a),關聯(holds a)

動態特性:

絕大多數情況,程式的功能是在編譯的時候確定下來,此為靜態特性,若是執行時候確定下來,則是動態特性。

c++虛函式,抽象基類,動態繫結(dynamic binding),多型(polymorphism)構成了出色的動態特性..

虛函式:子類自己去實現。一旦乙個函式被宣告為虛函式,派生類自動成為虛函式,一級級傳遞。建議每乙個都加virtual

抽象基類:

abstract class抽象類,無法例項化成乙個物件。 將基類的虛函式定義為純虛函式 virtual void f()=0;

抽象基類唯一目的就是讓其派生類繼承並實現它的介面方法。實現「介面與實現分離」。

純虛函式告知編譯器不用為函式編址,從而阻止該類的例項化。

抽象基類可分為好幾層的抽象類。如第一層shape 第二層shape2d,shape3d,抽象基類將提供豐富的介面函式供呼叫,這些都是public的虛函式,這樣的類                                  叫做介面類。

抽象基類不能例項化,並且實現類被完全隱藏,所以必須以其他的途徑獲得實現類的物件,比如提供入口函式來動態建立實現類的物件,入口函式可以是全域性函式,也可以使靜態成員函式。

pubilcbase* create()

#include using namespace std;

class base;

class b:public base

//自動為虛函式,加上virtual更好

virtual void g(){}

};base* base::create()//注意靜態成員函式寫在外面!

int main()

動態繫結:父類指標指向子類物件,可以呼叫虛函式。

每乙個具有虛函式的多型類的物件記憶體有4個位元組的大小存放虛表指標,指向虛函式表,虛函式表本質是乙個函式指標陣列,存放著這個類所有的虛函式的位址,包括那些繼承的但未改寫的虛函式。

#include using namespace std;

class a

};class b:public a

virtual void f(int n){}

};int main()

派生類定義了乙個與其基類的虛函式同名的函式,但是參數列不同,編譯器不會認為這個是對虛函式的改寫,而是隱藏。所以不會發生執行時繫結,相反,要想達成執行時繫結的效果,同名虛函式必須相同的原型,即參數列相同(返回型別可以不同,c++特徵===協變)

虛函式面臨的難題:抽象基類無法例項化,基類指標指向派生類物件,並不能告訴我們到底是哪乙個子類物件,因而不能進行相應的處理,僅有的靜態型別檢查和虛函式機制不足以解決所有的問題。所以我們有了rtti(run-time type identification)

rtti:

typeid:typeid()運算子以乙個物件或者型別名作為引數,返回乙個匹配的const type_info物件,它表明該物件的確切型別。

常用的三個成員函式; operaotr==(),operator()!=(),name()

if(typeid(base* p)==typeid(child)) ====>通過基類指標判斷型別

dynamic_cast<>運算子:派生類物件應該也是基類的物件,typeid()不存在這種功能

dynamic_cast<>可以轉換指標和引用,不能轉換物件。 

基類指標或引用===>子類指標或引用(downcast)  子類指標或引用====>基類指標或引用(upcast)

dynamic_cast《目標型別》(被轉換的型別)   目標型別為某種型別的指標(包括void*),成功轉換則返回目標型別 的指標,否則返回null

目標型別為某種型別的引用,成功則返回目標型別引用,失敗返回std::bad_cast,不存在null引用。

注意: 

1.dynamic_cast<>轉換引用,需要catch std::bad_cast

2.試圖用typeid來檢索null所指物件的型別,typeid(*p) 將丟擲bad_typeid異常

3.dynamic_cast<>轉換指標,記住返回值是否為null。

第十二章 物件 下

第十二章 物件 下 12.5.1 通過 isa 繼承 package mule our isa horse donkey perl 將首先在horse 裡 和他的任何前輩類裡,比如critter 查詢任何在mule裡找不到的方法,找不到以後才繼續在donkey 和其父類裡進行查詢。如果缺失的方法在乙...

第十二章 面向語言程式設計

第十二章 面向語言程式設計 在這一章,首先了解什麼是面向語言的程式設計 language oriented programming 許多人都在用,定義也各不相同。我們將主要討論它的優點 不足 然後,再看f 中面向語言程式設計的幾種不同方法,這些方法包括使用 f 文字建立 小語言 little lan...

第十二章 類和物件

類是多個類似事務組成的群體的統稱,能夠幫助我們快速理解和判斷事務的性質面向過程 物件導向 區別 面向過程 事務比較簡單,可以用線性的思維去解決,親力親為 物件導向 事務比較複雜,用簡單的線性思維無法解決 共同點 面向過程和物件導向都是解決實際問題的一種思維方式 總結 物件導向和面向過程相輔相成,二者...