不管是單繼承、多繼承,還是虛繼承,如果基於「簡單物件模型」,每乙個基類都可以被派生類中的乙個
slot
指出,該
slot
內包含基類物件的位址。這個機制的主要缺點是,因為間接性而導致空間和訪問時間上的額外負擔;優點則是派生類物件的大小不會因其基類的改變而受影響。
如果基於「**驅動模型」,派生類中有乙個
slot
指向基類表,**中的每乙個
slot
bptr
,它會被初始化,指向其基類表。這種策略的主要缺點是由於間接性而導致的空間和訪問時間上的額外負擔;優點則是在每乙個派生類物件中對繼承都有一致的表現方式,每乙個派生類物件都應該在某個固定位置上放置乙個基類表指標,與基類的大小或數量無關。第二個優點是,不需要改變派生類物件本身,就可以放大,縮小、或更改基類表。
不管上述哪一種機制,
「間接性
」的級數都將因為整合的深度而增加。c++
實際模型是,對於一般繼承是擴充已有存在的虛函式表;對於虛繼承新增乙個虛函式表指標。
無重寫,即派生類中沒有於基類同名的虛函式。
基類和派生類的**:
#pragma once#includeusing namespace std;
class base
;
#include "base.h"base::base(int i)
base::~base(void)
void base::print(void) const
#pragma once#include "base.h"
class derived : public base
;
#include "derived.h"為了支援rtticompleteobjectlocator必須引入乙個標頭檔案,這個標頭檔案中定義了一些結構體,這些結構體封裝了類的相關資訊。derived::derived(int i) : base(0)
//type_info.h測試結果:#pragma once
typedef unsigned long dword;
struct typedescriptor
;struct pmd
;struct rttibaseclassdescriptor
;struct rtticlasshierarchydescriptor
;struct rtticompleteobjectlocator
;
注意:有乙個點需要說明一下,從**和執行的結果中可以看出通過函式指標呼叫的函式和通過物件呼叫的函式,列印的成員變數的值是不一樣的,具體的原因是c++在呼叫成員函式的時候,會把某乙個物件傳遞給乙個成員函式隱藏的函式引數this指標。這樣,這個成員函式就知道了去操作哪乙個物件的資料,但是通過函式指標呼叫成員函式的話,就沒有乙個物件來初始化這個成員函式中的this指標。所以通過函式指標呼叫成員函式是找不到具體的操作物件的,所以列印的值是乙個隨機值。
C 物件模型 單繼承,多繼承,虛繼承
有兩個概念可以解釋c 物件模型 語言中直接支援物件導向程式設計的部分。對於各種支援的底層實現機制。資料成員分為靜態和非靜態,成員函式有靜態非靜態以及虛函式 class data members static和nonstatic class data functions static nonstati...
C 物件模型 單繼承,多繼承,虛繼承
有兩個概念可以解釋c 物件模型 語言中直接支援物件導向程式設計的部分。對於各種支援的底層實現機制。資料成員分為靜態和非靜態,成員函式有靜態非靜態以及虛函式 class data members static和nonstatic class data functions static nonstati...
3 單繼承和方法的重寫
物件導向三大特性 封裝 根據職責將屬性和方法封裝到乙個抽象的類中 繼承 實現 的重用,相同 不需要重複的編寫 1.單繼承 2.多繼承 多型 不同的物件呼叫相同的方法,產生不同的執行結果,增加 的靈活度 單繼承繼承的概念 語法和特點 繼承的概念 子類擁有父類所有的方法和屬性 當不同的類裡面,有需要使用...