繼承的相關知識

2021-08-03 18:40:27 字數 2744 閱讀 8832

定義:繼承是物件導向復用的重要手段,即物件導向的可重用性是通過「繼承」來實現的。解決在已有的類中增加新的特性,減少重複的工作量的問題。

已經存在的類,叫「基類」或「父類」;建立的新的類,叫「派生類」或「子類」。繼承是型別之間的關係模型,共享公有的東西,實現類內各自不同的東西。

繼承的定義格式為:

class derivelcassname(派生類):acess-label(繼承型別)baseclassname,其中冒號後面的統稱為派生類列表。

繼承的分類:

繼承分為單繼承和多繼承。

(1) 單繼承是乙個派生類只從乙個基類派生,稱為單繼承。

示意如下:

圖中,箭頭表示繼承的方向,從派生類繼承於基類。

下面是簡單的單繼承**:

class person

;class student: public person

;void test()

(2)多繼承:是乙個派生類有兩個或多個基類,稱為多重繼承。

簡單示意如下:

簡單的對多繼承的理解,**如下:

class person

;class student:public person

;void display(person &p,student &s)

int main()

繼承關係中構造、析構函式呼叫順序

(1)構造函式呼叫順序

(2)析構函式呼叫順序

繼承與轉換–賦值相容規則

(1)子類物件可以全部賦值給父類;

(2)父類物件不能賦值給子類物件;

(3)父類的指標或引用可賦值給子類物件;

(4)子類物件的指標或引用不能賦值給父類物件,但可通過強制型別轉換完成。

菱形繼承是由單繼承和多繼承組合的一種複雜的繼承關係,存在二義性和資料冗餘的問題。而菱形虛擬繼承則是為了解決菱形繼承所存在的問題。

菱形繼承的簡單示意圖如下:

其中派生類d既繼承於c1,又繼承於c2,通過派生類呼叫基類中的成員或成員函式時會產生二義性的問題

模型如下圖:

簡單模擬**如下:

//菱形繼承

#include

using namespace std;

class b

;class c1:public b

;class c2:public b

;class d:public c1,public c2

;int main()

在對基類中的成員變數訪問時,必須使用域訪問限定符,否則編譯器無法識別是哪個物件中的_b1賦值,雖然解決了二義性問題,但是產生了資料冗餘.

為了解決菱形繼承產生的二義性和資料冗餘的問題,採用了菱形虛擬繼承的方法,現對菱形虛擬繼承概括:

定義:菱形虛擬繼承是在繼承型別前加入虛擬(virtual)關鍵字,且使用的是偏移量**。

同名隱藏規則:

虛基類是只有乙個拷貝;

作用分辨符(::)的訪問方式:基類::成員(引數)/成員

同名隱藏規則:沒有虛函式的情況下,派生類中新增的與基類中的函式同名的函式,即使引數個數不同,則基類中的同名函式被覆蓋;如果派生類中的多個基類擁有同名成員函式,派生類也新增了同名函式,則基類都被隱藏(這種情況,對派生類的訪問用物件名。成員名,對基類的用作用分辨符)。

菱形虛擬繼承關係:

繼承關係如下圖所示:

菱形虛擬繼承模型如下:

如圖所示:

address1,address2這裡均存的是指標,指標指向偏移量**。偏移量**中先存該派生類相對於自己的位址,後存該派生類相對於基類的位址。

**及分析如下:

//菱形虛擬繼承

#include

using namespace std;

class b

;class c1:virtual

public b

;class c2:virtual

public b

;class d:public c1,public c2

;void test()

int main()

在除錯過程中,先看看d1中存了些什麼:

能看出d1儲存了指標變數的位址,指標變數的內容是指向虛基類的位址,是4個位元組,然後再看看這個位址中存放了什麼。

1c轉換成十進位制是28,32位平台下乙個位址是4個位元組,因此,指向的是繼承關係的模型中的_d1

好了,基本的先總結到這裡~

繼承相關知識

繼承的基本語法 class 子類 extends 父類 1.子類就會自動擁有父類定義的屬性和方法 2.父類又叫超類,基類 3.子類又叫派生類 繼承的注意事項與細節問題 1.子類繼承了父類所有的屬性和方法,但是私有屬性和方法不能在子類直接訪問,要通過父類公共方法區訪問 父類1 package com....

繼承 多型的相關知識

一 繼承 在php中,使用extends實現繼承。作用 如果我們不使用繼承,就要寫很多重複的 二 繼承的構造方法 1 子類繼承父類時,子類沒有構造方法,例項化子類物件時,會執行父類的構造方法。子類如果有自己的構造方法,例項化子類物件時,只會自動執行子類自己的構造方法。2 子類的構造方法有兩個引數,所...

C 繼承相關知識

在物件導向的程式設計中,有兩種截然不同繼承型別 實現繼承和介面繼承 1.實現繼承和介面繼承 實現繼承 表示乙個型別派生於基型別,它擁有該基型別的所有成員欄位和函式。在實現繼承中,派生型別採用基型別的每個函式的實現 除非在派生型別的定義中指定某個函式的實現 在需要給現有的型別新增功能,或許多相關的型別...