1. 程式人生 > >c++多繼承多型

c++多繼承多型

C++多繼承多型的實現

如果一個類中存在虛擬函式,在宣告類的物件時,編譯器就會給該物件生成一個虛擬函式指標,該虛擬函式指標指向該類對應的虛擬函式表。
多型的實現是因為使用了一種動態繫結的機制,在編譯期間不確定呼叫函式的地址,在呼叫虛擬函式的時候,去查詢虛擬函式指標所指向的虛擬函式表。
派生類生成的物件中的虛擬函式指標指向的是派生類的虛擬函式表,因此無論是基類還是派生來呼叫,都是查詢的是派生類的表,呼叫的是派生類的函式。

如果發生了多繼承,多個基類中都有虛擬函式,那麼該是怎樣的呢?虛擬函式指標如何排列,多個基類的指標為什麼能夠同時指向派生類物件,同時發生多型?
請看下面這段程式

#include <stdio.h>
#include <iostream> using namespace std; class Base1{ public: void fun() { printf("this is Base1 fun\n"); } virtual void fun1() { printf("this is Base1 fun1\n"); } }; class Base2{ public: void fun() { printf("this is Base2 fun\n"
); } virtual void fun2() { printf("this is Base2 fun1\n"); } }; class Derived : public Base1,public Base2{ public: void fun() { printf("this is Derived fun\n"); } void fun1() { printf("this is Derived fun1\n"); } void fun2() { printf
("this is Derived fun2\n"); } }; int main() { Derived *pd = new Derived(); Base1 *p1 = (Base1 *)pd; Base2 *p2 = (Base2 *)pd; p1->fun(); p2->fun(); p1->fun1(); p2->fun2(); printf("Base1 p1:%x\n", p1); printf("Base2 p2:%x\n", p2); return 0; }

執行結果如下

[email protected] ~/code/c++/cpp_muti_drived 
$ ./muti_derived 
this is Base1 fun
this is Base2 fun
this is Derived fun1
this is Derived fun2
Base1 p1:2097c20
Base2 p2:2097c28

Derived類分別繼承了Base1和Base2,根據結果來看,均發生了多型。基類指標呼叫函式,呼叫的均是派生類的物件。
通過打印出了p1和p2的地址,發現他們相差了8個位元組,就能明白了,在做型別轉換的過程中,如果把地址傳給第二個基類的指標的時候會自動把地址減去8,在64位系統下,剛好是一個指標的長度。因此p2指向的實際上是第二個虛擬函式指標的地址,這樣,就能夠實現多繼承的多型了。

相關推薦

3、【C++】繼承/

    面向物件的三個基本特徵是:封裝、繼承、多型。其中,封裝可以隱藏實現細節,使得程式碼模組化;繼承可以擴充套件已存在的程式碼模組(類);它們的目的都是為了——程式碼重用。而多型則是為了實現另一個目的——介面重用!     封裝:將一類事物所共有的屬性和行為方法進行總結,封裝在一個類中

C++封裝繼承總結

面向物件的三個基本特徵 面向物件的三個基本特徵是:封裝、繼承、多型。其中,封裝可以隱藏實現細節,使得程式碼模組化;繼承可以擴充套件已存在的程式碼模組(類);它們的目的都是為了——程式碼重用。而多型則是為了實現另一個目的——介面重用! 封裝           

c++繼承

C++多繼承多型的實現 如果一個類中存在虛擬函式,在宣告類的物件時,編譯器就會給該物件生成一個虛擬函式指標,該虛擬函式指標指向該類對應的虛擬函式表。 多型的實現是因為使用了一種動態繫結的機制,在編譯期間不確定呼叫函式的地址,在呼叫虛擬函式的時候,去查詢虛擬函

C++封裝繼承態總結

har 封裝繼承 cto www. vpd share ffffff .com ++ 由於作者不習慣該編輯器,只是貼出上本文的截圖,詳見:https://www.yuque.com/docs/share/9290d69e-e68c-4127-93d1-08e1f94c50

C++程式設計-繼承

                &nb

C++【繼承

兩個類間的關係:組合與繼承 繼承:可以使用現有類的所有功能,並在無需編寫原來的類的情況下對這些功能進行擴充套件。 通過繼承建立的新類稱為“子類”或“派生類”。   被繼承的類稱為“基類”,“父類”或“超類”。 繼承的作用:程式碼的複用 訪問許可權

C實現繼承、封裝和思路

1、繼承      把父類資料結構放在子資料結構的首位置,方便以後資料訪問和資料的強轉 struct parent{ int info; }; struct child { s

C++】繼承

物件模型:     物件中成員變數在記憶體中的佈局形式。     面向物件程式設計的核心思想是封裝(資料抽象)、繼承(程式碼複用)和多型(動態繫結)。 1.通過使用資料抽象,我們可以將類的介面與實現分離; 2.使用繼承,可以定義相似的型別並對其相似關係建模; 3.使用動態繫

C++繼承實現介面內容封裝例子

        封裝(private中的資料都通過Get與Set來訪問)可以使程式碼模組化,繼承(:)可以擴充套件已存在的程式碼,而多型的目的是為了介面重用(即相同名字的介面可能實現不同的Function功能,因為他們可能可以擴充套件成一個子類)。多型通過

C#中的介面和繼承

 上一節中我們學習到了建構函式,用來初始化一個物件的例項。同時在.NET Framework中,提供了解構函式用於清理物件。一般情況下不需要特別解構函式,系統會自動提供預設的解構函式來執行操作,清理不再需要的物件。 一、 靜態和例項類成員 屬性,方法和欄位等成員是物件例項所

c++ 抽象 繼承 封裝

面向物件的基本概念有物件、類、抽象、封裝、繼承、多型、介面等 有的人說面向物件有四大基本特徵,抽象,封裝,繼承,多型,但其實抽象可以丟擲在外,本質來說,面向物件的基本特徵是繼承,封裝,多型。 先來說C++中的物件和類: 類是物件的抽象,而物件是類的具體化,而要使用類的功能,具體就要先定義

C++中的、單繼承繼承、菱形繼承、菱形虛擬繼承

C++中的繼承體系,有單繼承、多繼承、菱形繼承、菱形虛擬繼承,以及各型別的物件模型,我們今天做一個簡單的剖析 (1)什麼多型? 所謂多型,就是“多種形態”。在面向物件的方法中一般是這樣描述多型的:向不同的物件傳送同一個訊息,不同的物件在接收時會產生不同的行為(即方法)。 多

C++ 多重繼承繼承 虛擬函式表

C++中的多重繼承和虛繼承是一個非常重要的概念,也是看你是不是懂C++的一個重要的標誌之一。這中間包括了執行時多型,虛擬函式表等等相關概念。 多重繼承,顧名思義,是一個類繼承了多個父類。例如class C:public A, publicB{};這樣就是一個多重繼承。 首先

C++之繼承

在程式設計領域,一個廣泛認可的定義是“一種將不同的特殊行為和單個泛化記號相關聯的能力”。和純粹的面向物件程式設計語言不同,C++中的多型有著更廣泛的含義。除了常見的通過類繼承和虛擬函式機制生效於執行期的動態多型(dynamic polymorphism)外,帶變數的巨集,模板,函式過載,運算子過載,拷貝構造等

C++中的和派生繼承

當類的繼承方式為私有繼承時,基類中的公有成員和保護成員都以私有成員身份出現在派生類中,而基類的私有成員在派生類中不可訪問。基類的公有成員和保護成員被繼承後作為派生類的私有成員,派生類的其他成員可以直接訪問它們,但是在類外部通過派生類的物件無法訪問。無論是派生類的成員還是通過派生類的物件,都無法訪問從基類繼承

28、不一樣的C++系列--繼承

繼承與多型 父子間的同名衝突 首先來看一段程式碼: #include <iostream> #include <string> using namespace std; class Parent { public:

C++的繼承

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

C++繼承匯總(單繼承繼承、虛繼承、菱形繼承

虛基類表指針 www 地址 編譯 聲明 pre 繼承 第一個 src 一、C++中的對象模型 1、 概念 語言中直接支持面向對象程序設計的部分; 對於各種支持的底層實現機制。(沒看懂……) 2、 類中的成員分類 a) 成員函數   i. static function   

c++繼承

http 對象 類的成員 多繼承 顯示調用 不能 有一個 沒有 調用 1.多繼承二義性產生的原因: 子類同時繼承多個基類,而這些基類又有一個共同的基類,則導致在子類對象中調用父類成員時,調用不明確;即:二義性。 2.虛繼承能解決的而已情況:有共同老祖宗的能解決二義性,沒有共

C++語言學習(十六)——繼承

虛函數表 -o nag http layout 調用 img error names C++語言學習(十六)——多繼承 一、多繼承簡介 1、多繼承簡介 C++語言支持多繼承,一個子類可以有多個父類,子類擁有所有父類的成員變量,子類繼承所有父類的成員函數,子類對象可以當作任意