C 中級 繼承

2022-02-15 03:42:43 字數 2581 閱讀 4415

基本語法

#include #include 

using

namespace

std;

//語法:子類類名:public 父類類名

class

animal

;void walk(string

args)

};class dog:public

animal

string

name;

};class cat:public

animal

string

name;

};int

main() ;

class son :public

dad;

class son2 :protected

dad ;

class son3 :private

dad ;

intmain() ;

class son:public grandfather,public

father

構造與析構順序/屬性繼承訪問

#include using

namespace

std;

//1.構造解析順序;

//2.父類子類屬性與方法同名訪問辦法;

//3.靜態屬性訪問辦法;

class

base ;

~base()

int a = 20

;void func()

static

intstatic_b;

};int base::static_b = 33

;class son:public

base ;

~son()

int a = 33

;void func()

static

intstatic_b;

};int son::static_b = 66

;int

main() ;void walk(string args) };

class dog:public animalstring

name;};

class cat:public animalstring

name;};

intmain()

虛繼承 

在多繼承的場景裡,當父類中存在同名變數時,子類訪問父類的同名變數,將出現二義性,因為編譯器不知道你將要訪問的是哪個父類中的變數。

舉個例子:

classa;

class

b1 :

public a

;class

b2 :

public a

;class

c :public b1, public b2

;int

main

()

一般來說,單繼承就可以滿足我們 99% 的需求了,我們應該盡量避免使用多繼承帶來的二義性問題。(注意:這裡說的單繼承不包括下面說的這種類似於「介面」的父類)。

由於 c++ 中不存在介面,但是可以使用只包含純虛函式的抽象類替代,如果是只包含純虛函式的抽象類,再多繼承都將不會發生二義性(父類都沒有變數了當然不會有二義性)。

虛繼承只能解決多個父類的同名變數都是從公共基類中繼承而來的情況,就是下圖這種:

使用虛繼承:

classa;

class

b1 :

virtual

public a // 虛繼承

;class

b2 :

virtual

public a // 虛繼承

;class

c :public b1, public b2

;int

main

()

原理:使用虛繼承時,c++ 編譯器會做特殊處理,只會呼叫乙個公共基類 a 的構造方法,這樣就不會建立出多個同名變數 a 了。

還有一種二義性出現的場景,就是多個父類都是獨立的,它們沒有公共基類,這些獨立的父類中存在同名變數的話,就不能使用虛繼承來解決了,類似下圖這樣子:

這種情況,我們就只能使用「類名::變數名」顯性訪問,避免二義性了:

classb1;

classb2;

class

c :public b1, public b2

;int

main

()

同樣,如果父類還存在同名方法,我們也可以使用「類名::方法名」這樣顯性呼叫。

C 中級 事件

定義 從概念上理解,事件就是某乙個物件向另外乙個物件傳送乙個訊息,事件的傳送方負責傳送,接收方負責接收。詳解事件,我硬講,你是肯定不能理解的,因為事件和委託非常相似。事件其實是對委託的封裝 封裝沒忘吧?就是保護 委託,就是發起方明確告訴接收方,我需要什麼。然後接收方就負責去執行。事件,就是我給你傳送...

C 中級 多型

基本概念 include include using namespace std 抽象類,無法例項化物件。class animal class dog public animal class pig public animal 1.在編譯階段,已確定函式位址為animal了。在執行階段,因為有了vi...

C 中級 多型

基本概念 include include using namespace std 抽象類,無法例項化物件。class animal class dog public animal class pig public animal 1.在編譯階段,已確定函式位址為animal了。在執行階段,因為有了vi...