談談c 中繼承中的虛函式

2021-06-22 01:37:00 字數 1598 閱讀 9773



c++是一種物件導向的程式語言的乙個很明顯的體現就是對繼承機制的支援,c++中繼承分很多種,按不同的分類有不同分類方法,比如可以按照基類的個數分為多繼承和單繼承,可以按照訪問許可權分為public繼承、protected繼承和private繼承,按照是否是虛擬繼承可以分為virtual繼承和non-virtual繼承。當然這裡的分類標準都是有重疊的部分,比如,non-virtual繼承又可以分為單繼承和多繼承。這裡要討論的是虛函式,因此主要從virtual和non-virtual繼承兩個方面來展開討論分析。

1、non-virtual繼承

non-virtual繼承又有兩種情況單繼承和多繼承。來看乙個例子:

class base1

virtual void h(){}

};class base2

};class derive1:public base1

virtual void f1(){}

}class derive2:public base1,public base2

virtual void g(){}

virtual void g1(){}

};

建立四個物件:

base1 b1;

base2 b2;

derive1 d1;

derive2 d2;

學習c++的都知道裡面的虛函式表,上面的繼承體系中各個類的虛函式表如下:

base1的虛函式表如下:

vptr-->base1::f base1::h//vptr為指向類的虛函式表的指標,-->表示的意思是指向乙個表,後面的內容是表中的內容

base2的虛函式表如下:

vptr-->base2::g //

derive1的虛函式表如下:

vptr-->derive1::f  base1::h 

derive1::f

derive2的虛函式表如下:

vptr1-->derive2::f base1::h derive2::g1 //base1

vptr2-->derive2::g //base2

在windows開發平台檢視虛函式表如下:主機環境為 win7+vs2013(顯示的不完全),在除錯模式下:

2、virtual繼承

class base1

};class base2

};class derive1:virtual public base1

virtual void f1(){}

}class derive2:virtual public base1,virtual public base2

virtual void g(){}

virtual void g1(){}

};

通過vs2013檢視虛函式表如下:

本文參考了知名技術博主左耳朵耗子在csdn上的部落格,

C 中繼承與虛函式

一 類與類之間的關係 1 類與類之間可能會存在共性 2 類與類之間必定會有差異 3 為了節約開發時間和 量,我們在設計時可以把類的共項抽象出來形成乙個基礎類 基類 4 使用基類 差異生成乙個新的類叫派生類 二 繼承的語法 1 在設計乙個類時如果已有的類中有它需要的成員,它可以從已有的類中繼承哪些成員...

C 中繼承,虛函式的呼叫問題

類繼承 如下 問 呼叫輸出的結果是什麼 class ca void fun2 class cb public ca void fun2 void main 呼叫輸出結果為 cb fun1 cb fun1 ca fun2 原因分析 由於 ca p new cb 中,雖然p是ca指標,但是他指向的虛函式...

虛函式 虛繼承 C

關於虛表,我們就要用到乙個關鍵字 virtual,可以修飾函式,也可以修飾類。類的成員函式被virtual修飾之後,就成為了虛函式 修飾類,主要是虛繼承。在此之前,我們首先要了解乙個概念 物件模型,也就是說,乙個基類形成之後,裡面的成員是怎麼存放的,當派生類繼承基類之後,派生類的成員是怎麼存放的。我...