關於C 物件導向的 動態繫結

2021-06-22 04:54:29 字數 1282 閱讀 9074

在c++primer裡說,物件導向程式設計基於三個基本概念:資料抽象、繼承和動態繫結。其實我理解起來也是雲裡霧裡,感覺簡單來說,資料抽象應該說的就是類機制,繼承肯定就是類的繼承了,動態繫結第一次聽說,聽著有些不知所云,可能經常用,但是對於像我這種初學者可能不知道叫這個名字而已,這裡當作筆記記下了,加深自己的理解:

c++prinmer裡給「動態繫結」有一句話的說明:通過動態繫結,我們能夠編寫程式使用繼承層次中任意型別的物件,無需關心物件的具體型別。這句話實在是太費解了,結合本書解釋的例子,這句話通俗點兒來說就是,通過動態繫結,編譯器在執行時決定應該呼叫基類函式還是呼叫繼承類中定義的函式。而決定是基類函式呼叫還是繼承類函式呼叫僅僅取決於函式在呼叫時,傳遞的實參是基類物件還是繼承類的物件。就這麼簡單的事情,搞的我折騰了大半天。

c++primer裡面有段關於動態繫結的注釋:在c++中,通過基類的引用(或指標)呼叫虛函式時,發生動態繫結。 引用(或指標)既可以指向基類物件也可以指向派生類物件,這一事實是動態繫結的關鍵。用引用(或指標)呼叫的虛函式在執行時確定,被呼叫的函式是引用(或)指標所指物件的實際型別所定義的。

這三句話概括的很好理解:既在c++程式設計中,比方說,如果某種需要,要呼叫函式c(首先a形參必須是基類的引用或指標),則根據上面的意思,這裡c就有兩種呼叫方法:c(a,m)或者c(b,m),y()是虛函式,這就符合了動態繫結的條件。 因為c函式的形參是基類引用,所以在傳遞實參的時候,既可以傳遞基類a物件a,也可以傳遞繼承子類b物件b,這就是第二句話的意思。最後第三局是針對函式c的具體實現的,這裡可以看到這個函式實現了一次x()呼叫一次y()呼叫,x是基類a的非虛擬成員函式,所以根據繼承原理,無論這裡是c(a,m)還是c(b,m),呼叫的都是基類的x();  動態繫結出現在y()上,如果c(a,m),傳遞基類的實參,則呼叫的是基類的虛函式y(), 若是c(b,m)則呼叫的是繼承子類b的虛函式y()。這就是所謂的c++物件導向的動態繫結,就也就是前面說的所謂的編譯器在執行時決定是使用基類中定義的虛函式還是派生類中定義的虛函式。

class a

public:

void x();

virtual void y(); /* a的虛函式y */;

class b:public class a

public:

void m();

virtual void  y(); /* b中繼承a的並重寫的虛函式y */;

/* c++設計中 */

a a;

b b;

int m=3;

void c(const a &a, int m)

a.x();

a.y();

}

C 動態繫結

c 中動態繫結是將乙個過程呼叫與相應 鏈結起來的行為。是指與給定的過程呼叫相關聯的 只有在執行期才可知的一種繫結,他是多型實現的具體形式。c 中,通過基類的引用或指標呼叫虛函式時,發生動態繫結。引用 或指標 既可以指向基類物件也可以指向派生類物件,這一事實是動態繫結的關鍵。用引用 或指標 呼叫的虛函...

c 動態繫結

c 的函式呼叫預設不使用動態繫結。要觸發動態繫結,必須滿足兩個條件 只有指定為虛函式的成員函式才能進行動態繫結 必須通過基類型別的引用或指標進行函式呼叫 因為每個派生類物件中都擁有基類部分,所以可以使用基類型別的指標或引用來引用派生類物件 示例 include include using names...

C 動態繫結

繫結是乙個把過程呼叫和響應呼叫所需要執行的 加以結合的過程。繫結是在編譯時進行的,叫作靜態繫結,也叫做靜態聯編。動態繫結 動態聯編 執行時繫結 則是在執行時進行的,因此,乙個給定的過程呼叫和 的結合直到呼叫發生時才進行。1 在c 語言中,當我們使用基類的引用 或指標 呼叫乙個虛函式時將發生動態繫結,...