c 繼承 繼承 的二義性 虛函式

2021-08-25 19:23:32 字數 2971 閱讀 3974

父類 plane 兩個類: 乙個是標頭檔案 乙個是原始檔

#pragma once

#include

class plane

;

原始檔

#include 

#include

//#include

using

namespace

std;

plane::plane() :name("f-22"), year(2010)

plane::plane(std::string name, int year) :name(name), year(year)

plane::~plane()

void plane::fly()

void plane::land()

void plane::printf()

子類 兩個檔案 標頭檔案 原始檔

#pragma once

#include

class jet : public plane

;

這裡繼承 使用: 來繼承

原始檔

#include 

#include

using

namespace

std;

jet::jet()

jet::jet(std::string name, int year)

jet::~jet()

主類 main 呼叫

#include 

#include

#include

#include

using

namespace

std;

void func()

void main()

列印結果 :

plane 無參(預設)的建構函式: 名字:f-22 生產年代:2010

jet 無參(預設)數的建構函式 名字: f-22 生產年代:2010

plane 的fly函式

jet 的析構函式

plane 的析構函式

請按任意鍵繼續. . .

上面 jet.fly() 呼叫的是父類的方法, 沒有在子類裡宣告任何方法

如果在子類 jet裡面定義和父類plane裡面相同的方法 那麼呼叫的時候就是子類的方法.重寫

如果已經重寫了 那麼

可以看到呼叫順序

建立的時候 先呼叫父類的建構函式 釋放時 先呼叫子類的析構函式

jet.plane :: fly();
這樣就呼叫了父類的函式.

//派生類賦給父類

plane *pl =

&jet//指標

pl->fly();

plane &p2 = jet;//物件

p2.fly();

過載和重寫

過載 引數不同函式名相同

重寫 都相同

class a

;class a1: public a

;class a2 : public a

;//多繼承的二義性 :只能顯示使用根屬性

//多繼承用逗號分隔

class b : public a1, public a2

;

呼叫:

b b;

//b:: name = "test";// 如果直接呼叫會報錯, 不知道使用的是a1還是a2的 name 這就是繼承的二義性

b.a1::name = "namea1"; //只能顯示呼叫

b.a2::name = "namea2";

如果想給父類的name賦值 ?

// virtual 虛繼承 : 解決路徑不明確的問題,使多個繼承的同名成員時候 只有乙份拷貝

兩個派生類

class a1:virtual

public a

;class a2 : virtual

public a

;

呼叫:

b

b; b

: name = "test";

// 如果直接呼叫 不知道使用的是a1還是a2的 name 繼承的二義性

b.a1

::name = "namea1";

//只能顯示呼叫

b.a2

::name = "namea2";

當乙個類派生自基類,該基類可以被繼承為 public、protected 或 private 幾種型別。繼承型別是通過上面講解的訪問修飾符 access-specifier 來指定的。

我們幾乎不使用 protected 或 private 繼承,通常使用 public 繼承。

詳細看這裡

//用父類的指標來new乙個子類的物件

plane *jet = new copter();

//呼叫了子類中的虛函式

jet->land();

//**

delete jet;

jet = nullptr; //這種情況存在記憶體洩漏的可能

結果呼叫了父類的析構函式 但是沒有呼叫子類的析構函式. 這個時怎麼解決.

解析: 父類加上virtual關鍵字,那麼子類裡面預設也是加上了virtual.

相似**參考

純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加」=0」

virtual

void funtion1()=0

實際就是定義個介面

參考資料

C 繼承 二義性 虛繼承

繼承 子類擁有父類所有的成員變數和函式 子類是一種特殊的父類 子類可以當做父類的物件使用 子類可以擁有父類沒有的方法和屬性。class parent class child public parent int main 繼承的訪問控制 c 中的繼承方式會影響子類對外訪問屬性 1 看呼叫語句,是在類的...

C 多繼承的二義性

單繼承 派生類只從乙個基類派生 多繼承 派生類從多個基類派生 多重派生 有乙個基類派生出多個不同的派生類 多層派生 派生類又作為基類,繼續派生出新的類 多繼承可以看作是單繼承的擴充套件。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是乙個單繼承。多繼承下派生類的定義格式如下 c...

C 多繼承的二義性

多繼承可以看作是單繼承的擴充套件。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是乙個單繼承。多繼承下派生類的定義格式如下 class 派生類名 繼承方式1 基類名1 繼承方式2 基類名2 其中,繼承方式1 繼承方式2 是三種繼承方式 public private protec...