建立: 1.farmer類,資料成員:m_strname,成員函式:構造、析構、sow()
2.worker類,資料成員:m_strcode,成員函式:構造、析構、carry()
3.migrantworker類,資料成員:無,成員函式:構造、析構
4.person類,資料成員:m_strcolor,成員函式:構造、析構、printcolor()
派生關係:person ->farmer->migrantworker;person ->worker->migrantworker;worker和farmer->migrantworker
person.h
#include#includeusing namespace std;
class person
;
person.cpp
#include"person.h"
person::person(string color)
;
farmer.cpp
#include"farmer.h"
farmer::farmer(string name,string color):person("farmer"+color)
;
worker.cpp
#include"worker.h"
//為了證明在migrantworker類中已經存在了兩份person的資料,將字串worker也傳遞給person,字串之間可以拼接
worker::worker(string code,string color):person("worker"+color)//使用初始化列表將值向下進行傳遞,好處是如果person當中有其他的邏輯,我們就不需要重複去寫,而可以將值直接地傳遞給person的建構函式
;
migrantworker.cpp
#include"migrantworker.h"
migrantworker::migrantworker(string name,string code,string color):farmer(name,color),worker(code,color)
執行結果:
因為migrantworker分別繼承了worker和farmer,worker和farmer的標頭檔案中都有person.h,所以migrantworker包含了兩份person.h,造成重定義(即在當前工程中,person被宣告了兩遍)-->解決用巨集定義-->在person.h中加上巨集定義即可
在person.h中加上巨集定義之後執行:
根據執行結果,發現在migrantworker類中已經存在了兩份person的資料-->解決用虛繼承
其餘**不變,將worker.h和farmer.h中繼承方式前加上virtual關鍵字
worker.h
#include"person.h"
class worker:virtual public person//虛繼承
;
farmer.h
#include"person.h"
class farmer:virtual public person
;
執行結果:
使用了virtual關鍵字之後,就形成虛繼承,好處:migrantworker所例項化的物件當中只有乙份person的資料
執行結果為blue,說明在虛繼承的情況下作為菱形繼承最頂層的父類並沒有進行引數的傳遞,引數只使用了頂層父類的預設引數,而無法從子類當中獲得傳入的引數。
C 多繼承 菱形繼承 虛繼承
b和c都單繼承了a d繼承了b和c 是多繼承 有兩個或兩個以上的基類就是多繼承 class a public int ma class b public a public int mb class c public a public int mc class d public b,public c ...
c 多重繼承 虛繼承 菱形繼承
多重繼承的特性和使用和單繼承沒區別。按照單繼承來使用即可。多重繼承可能會引入乙個 菱形繼承的問題 這個問題其實並不算問題,因為它合情合理,即多個基類 擁有乙個共同的基類,那麼在構造的時候,由於構造的遞迴特性,就會出現共同基類出現兩份例項的 情況,而且如果針對性修改,那麼如果不在訪問共同基類的時候先指...
菱形繼承和菱形虛繼承
繼承是c 的一大特點,我們通過菱形繼承和菱形虛繼承對繼承進行進一步的分析。菱形繼承 建立乙個基類a讓b1和b2公有繼承於它,讓c公有繼承b1和b2。class a a int a class b1 public a b1 int b1 class b2 public a b2 int b2 clas...