C 明智而審慎地使用多重繼承

2021-08-18 17:37:11 字數 2085 閱讀 4121

20180327 c++ 明智而審慎地使用多重繼承

當多重繼承(multiple inheritance,mi)運用到程式設計中時,程式有可能從乙個以上的基類繼承相同的名稱(如函式,typedef等),那會導致較多的歧義,eg:

class borrowableitem;

class company;

class ***player:

public borrowableitem,

public company

;***player mp;

mp.checkout();//歧義,到底呼叫的是哪個checkout() ?

為了解決這個歧義,必須明白指出要呼叫的哪乙個基類內的函式:

mp.borrowableitem::checkout();

當然也可以嘗試明確呼叫company()::checkout(),但會獲得「嘗試呼叫私有成員函式」的錯誤。

多重繼承的意思是 繼承乙個以上的基類,但這些基類常擁有更改機的基類,這很可能導致「鑽石型多重繼承」:

class file;

class inputfile:public file;

class outputfile:public file;

class iofile:public inputfile,

public outputfile

;假設file類有個成員變數filename,那麼iofile內該有多少比這個名稱的資料呢,  c++預設做法是iofile從其每乙個基類繼承乙份,所以其物件內有兩份filename成員變數。

如果你不想那樣做(即它繼承自兩個基類,而file那麼不被複製),你需讓帶有此資料的類(即file)成為乙個虛基類,所以要讓所有直接繼承自它的類採用「虛繼承」:

class file;

class inputfile:virtual public file;

class outputfile:virtual public file;

class iofile:public inputfile,

public outputfile

;對虛基類(virtual base classes)(同樣使用於虛繼承)的忠告:

1)非必要不要使用虛基類(virtual base classes),平常請使用非虛(non-virtual)繼承;

2)若必須使用虛基類(virtual base classes),盡量避免在其中放置資料。這樣你就不需擔心這些類身上的初始化(和賦值)所帶來的詭異事情。

考慮下面這個用來形容(塑模,modeling)人的c++ 介面類(inte***ce class);

class iperson;

iperson的客戶必須以iperson的指標(pointers)和引用(references)來編寫程式,因為抽象類無法被實體化建立物件,為了建立一些可被當做iperson來使用的物件,iperson的客戶使用 工廠函式(factory functions)將「派生自iperson的具象類」實體化:

//factory function(工廠函式),根據乙個獨一無二的資料庫id建立乙個person物件。

std::tr1::shared_ptrmakeperson(databaseid personidentifier);

//這個函式從使用者手上取得乙個資料庫id

databaseid askuserfordatabaseid();

databaseid id(askuserfordatabaseid());

std::tr1::shared_ptrpp(makeperson(id));

//建立乙個物件支援iperson介面。

//藉由iperson成員函式處理*pp

.../***********************看的一頭霧水***************************/

注意:1)多重繼承比單一繼承複雜,它可能導致新的歧義性,以及對虛繼承的需要。

2)虛繼承會增加大小、速度、初始化(及賦值)複雜度等成本。若虛基類不帶任何資料,將是最具實用價值的情況。

3)多重繼承的確有正當用途。其中乙個用途可以適用到下面的情景: 「公有繼承摸個介面類(inte***ce class)」與「私有繼承某個協助實現的類」的組合形式。

明智而審慎的使用Private繼承

c 如何將public繼承視為is a。private繼承並意味著 is a 如果類之間的繼承關係是private。編譯器不會自動將乙個derived物件轉換成乙個base classes。這和public繼承的情況不同。由private base classes繼承而來的所有成員,在derived...

明智而審慎的使用private繼承

private繼承的兩條規則 1 編譯器不會將乙個derived class轉化為baseclass,但是卻可以顯示轉換。也就是,他們之間不是is a的關係。2 從基類繼承的所有的成員和方法都將變為private屬性。也就是,它只繼承實現,不整合介面。private繼承意味著 根據某物實現出 它和復...

審慎而明智地使用SQL觸發器

觸發器可以說是資料庫中的常用工具,不過,這個功能是否被合理利用,也在一定程度上影響了最終成品的各方面效能。要想把說明觸發器的適用範圍,就得先說說觸發器本身具有哪些特點 基於觸發器的上述特點,並站在乙個軟體全域性的角度來看,觸發器應該保持對於開發人員的透明性,也就是說,開發人員應當始終不需要知道某個觸...