基本語法
#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...