1. 程式人生 > >虛擬繼承和模板繼承

虛擬繼承和模板繼承

虛擬繼承程式碼:

class B1
{
public:
    void SayHi()
    {
        PrintClassName();
    }

protected:
    virtual void PrintClassName()
    {
        printf("This is B1. \n");
    }
};

class D1 : public B1
{

};

class D2 : public B1
{
protected:
    virtual void PrintClassName()
    {
        printf("This is D2. \n"
); } }; int _tmain(int argc, _TCHAR* argv[]) { D1 d1; D2 d2; d1.SayHi(); d2.SayHi(); getchar(); return 0; }

模板繼承程式碼:

template<class T>
class B1
{
public:
    void SayHi()
    {
        T* pT = static_cast<T*>(this);
        pT->PrintClassName();
    }

protected
: void PrintClassName() { printf("This is B1. \n"); } }; class D1 : public B1<D1> { }; class D2 : public B1<D2> { public: void PrintClassName() { printf("This is D2. \n"); } }; int _tmain(int argc, _TCHAR* argv[]) { D1 d1; D2 d2; d1.SayHi(); d2.SayHi(); getchar(); return
0; }

模板繼承的優點:
1) 不需要使用物件的指標
2) 節省記憶體,因為不需要使用虛擬函式表
3) 不會因為未初始化的虛擬函式表導致使用NULL指標
4) 所有函式的呼叫在編譯時確定,因此它們是可以優化的。

相關推薦

虛擬繼承模板繼承

虛擬繼承程式碼: class B1 { public: void SayHi() { PrintClassName(); } protected:

c++虛擬函式繼承

1.多繼承可能會出現奇葩現象,多個同樣的變數,導致子類不知道呼叫的那個變數來自哪個父類。2.如果一個外部方法的引數是父類,那麼即使傳了一個子類,在方法中呼叫這個類的內部方法,不管你傳入的是子類還是父類,都會強行給你呼叫父類的方法。因為編譯器認為這樣是安全的,這個方法一定在父類

C++ 虛擬函式繼承解析

本文針對C++裡的虛擬函式,虛繼承表現和原理進行一些簡單分析,有不對的地方請指出。下面都是以VC2008編譯器對這兩種機制內部實現為例。 有喜歡或者想學習C/C++的朋友加一下我的C/C++交流群815393895。謝謝大家的支援 虛擬函式 以下是百度百科對於虛擬函式的

轉載:虛擬函式繼承的記憶體分佈

最近做題的時候經常遇到虛擬函式和虛繼承的記憶體分佈情況問題,自己也有點生疏了,所以,趕緊在這裡回憶補充一下! 先從一個類的記憶體分佈情況開始看起: 環境:VS2012 class A { int a; public: A() :a(1) {} void fu

C++:虛擬函式繼承

1:虛解構函式主要是為了解決釋放父類的指標,同時釋放子類的指標,防止記憶體的洩露;例如 Father p = new Son();delete P;P= NULL;如果父類沒有解構函式則會造成記憶體洩露

47)多繼承繼承

兩個 body name sleep pos out inf ima bsp 1)下面是一個多繼承的 代碼:      1 #include<iostream> 2 3 using namespace std; 4 class bed 5 {

類的繼承繼承運用

run sch 方式 沒有 自己的 共創 tel clas obj ```通過繼承創建的新類稱為“子類”或“派生類”。 被繼承的類稱為“基類”、“父類”或“超類”。 繼承概念的實現方式主要有2類:實現繼承、接口繼承。 1、實現繼承是指使用基類的屬性和方法而無需額外編碼

繼承與派生(4):二義性(三角繼承菱形繼承

         一般說來,在派生類中對基類成員的訪問應該是唯一的,但是,由於多繼承情況下,可能造成對基類中某成員的訪問出現了不唯一的情況,則稱為對基類成員訪問的二義性問題。  實際上,在上例已經出現過這一問題,回憶一下上例中(參照繼承

繼承第二節 原型繼承Es6繼承

原型繼承主要是繼承*父類原型上的*屬性或者方法。   1.建立一個空的建構函式 2.把空建構函式的原型等於父類的原型 3.把子類的原型等於空建構函式的例項物件   這樣就達到了繼承屬性的目的(主要注意:手動修正constructor指向)

effective c++條款34:區分介面繼承實現繼承

1. 純虛擬函式也可以有具體實現 #include <iostream> using namespace std; class Airplane { public: virtual void fly(const char *)const = 0; }; void Airplan

Python 封裝,繼承 繼承

繼承 目標 單繼承 多繼承 面向物件三大特性 封裝 根據 職責 將 屬性 和 方法 封裝 到一個抽象的 類 中 繼承 實現程式碼的重用,相同的程式碼不需要重複的編寫 多型 不同的物件呼叫相同的方法,產生不同的執行結果,增加程式碼的靈活度

十二、python學習之python高階二(property、魔法方法魔法屬性、多繼承多重繼承、閉包裝飾器)

一、property: 1.get/set方法: 1.1 隱藏實現細節:在使用物件時,儘量不要讓使用者直接操作物件中的屬性,這樣會帶來安全隱患。改進辦法,使用私有屬性。 1.2 提供精確的訪問控制:學習過 set/get方法,是專門來為類的私有屬性提供訪問介面。 1.

python基礎-繼承繼承複習

繼承 : 什麼是什麼的關係 單繼承 ***** # 先抽象再繼承,幾個類之間的相同程式碼抽象出來,成為父類 # 子類自己沒有的名字,就可以使用父類的方法和屬性 # 如果子類自己有,一定是先用自己的 # 在類中使用self的時候,一定要看清楚self指向誰 多繼承 ***

《Effective C++》讀書筆記 條款34:區分介面繼承實現繼承

第一次記錄讀書筆記,因為覺得純讀很沒有意思,於是突然決定開始寫部落格記錄一下,理解的也不深。菜鳥也希望能有進步,希望自己堅持,前面的條款在後來會補。 這一條款主要講純虛擬函式、虛擬函式和普通成員函式在public繼承時不同的地方。public繼承的概念包括兩個:

繼承組合 繼承組合

繼承和組合 一、組合 組合:組合指的是,在一個類中以另外一個類的物件(也就是例項)作為資料屬性,稱為類的組合    也就是說:一個類的屬性是另一個類的物件

談一談我對java單繼承繼承的理解。

今天終於重拾書本,感覺好久好久沒有認真看過書了樣。好了不說廢話了。 偶是菜鳥,可能理解有誤。高手們指點指點哦。 今天看那書上說:java是但繼承,並不支援多繼承,後來又講到java支援多繼承,是在介面的基礎上實現多繼承。 總的來說還是不支援多繼承,要通過其他方式來彌補jav

C++ 深入理解 虛繼承、多重繼承直接繼承

【摘要】 本文從5段程式碼例項出發,通過類中類的普通繼承,類的虛繼承,類的多重繼承,多個虛擬函式類的普通繼承、虛繼承與多重繼承,幾個交叉概念,詳細的闡釋了繼承、虛擬函式與虛繼承的基本概念,深入剖析了繼承於虛繼承的區別於聯絡。 【Exp.001-虛繼承】 #includ

區分介面繼承實現繼承

公有繼承public的概念,可以分為兩部分:函式介面繼承和函式實現繼承。在public繼承下,派生類總會繼承基類的介面。也就是成員函式的介面總是會被繼承。pure virtual純虛擬函式只具體指定介面繼承。impure virtual(非純)函式具體指定介面繼承及預設實現繼

c++公有繼承、保護繼承私有繼承

C++中的繼承方式有:public、private、protected三種(它們直接影響到派生類的成員、及其物件對基類成員訪問的規則)。(1)public(公有繼承):繼承時保持基類中各成員屬性不變,並且基類中private成員被隱藏。派生類的成員只能訪問基類中的publi

關於公有繼承,保護繼承私有繼承

假設現在有一個名叫大地主的類,他有下面三個成員:公有成員:一塊空地保護成員:傳家寶私有成員:QQ號所謂公有成員,就是你可以和大地主商量,讓他把空地租給你,對外說的時候,你要說清楚你這個地是大地主的一塊空地,也就是:大地主.一塊空地傳家寶當然是只給其後代(派生類)的,其他人要用