C++ 類的繼承和多繼承

c++ 繼承實(shí)例

1.默認(rèn)是 隱式代碼: : private Person
2.私有繼承:在子類里面是可以訪問父類的成員澄干,但是在類的外面不行
3.必須公開繼承办悟,才可以訪問父類的成員

#include <iostream>

using namespace std;

class Person {
public:
    char *name;
    int age;

public:
    Person(char *name, int age) : name(name) {
        this->age = age;
        cout << "Person 構(gòu)造函數(shù)" << endl;
    }

    void print() {
        cout << this->name << " , " << this->age << endl;
    }
};

// 1.默認(rèn)是 隱式代碼: : private Person
// 2.私有繼承:在子類里面是可以訪問父類的成員,但是在類的外面不行
// 3.必須公開繼承,才可以訪問父類的成員
class Student : public Person {

// 類 默認(rèn)是私有,注意下

private:
    char * course;

public:
    // :父類 , 給自己子類成員初始化
    Student(char * name, int age, char* course) : Person(name, age) , course(course) {
        cout << "Student 構(gòu)造函數(shù)" << endl;
    }

    void test() {
        cout << name << endl;
        cout << age << endl;
        print();
    }
};

int main() {
    Student stu("李元霸", 99, "C++");

    // 公開繼承,才可以拿父類的成員
    stu.name = "李四";

    return 0;
}

C++是有多繼承的

Java語言不允許多繼承介杆,多繼承有歧義,如果Java語言多繼承 就會(huì)導(dǎo)致代碼不健壯韭寸,(二義性)
Java多實(shí)現(xiàn):做的非常棒春哨,嚴(yán)格避免出現(xiàn) 二義性問題(歧義)
下面是,第一種簡單多繼承問題恩伺,解決方案赴背。

#include <iostream>

using namespace std;

class BaseActivity1 {
public:
    void onCreate() {
        cout << "BaseActivity1 onCreate" << endl;
    }

    void onStart() {
        cout << "BaseActivity1 onStart" << endl;
    }

    void show() {
        cout << "BaseActivity1 show" << endl;
    }
};

class BaseActivity2 {
public:
    void onCreate() {
        cout << "BaseActivity2 onCreate" << endl;
    }

    void onStart() {
        cout << "BaseActivity2 onStart" << endl;
    }

    void show() {
        cout << "BaseActivity2 show" << endl;
    }
};

class BaseActivity3 {
public:
    void onCreate() {
        cout << "BaseActivity3 onCreate" << endl;
    }

    void onStart() {
        cout << "BaseActivity3 onStart" << endl;
    }

    void show() {
        cout << "BaseActivity3 show" << endl;
    }
};

// 子類 繼承 三個(gè)父類
class MainActivity1 : public BaseActivity1, public BaseActivity2, public BaseActivity3 {
public:
    void onCreate() {
        cout << "MainActivity1 onCreate" << endl;
    }

    void onStart() {
        cout << "MainActivity1 onStart" << endl;
    }

    void showSonInfo() {
        cout << "MainActivity1 showSonInfo" << endl;
    }

    // 解決方案二: 子類上 重寫父類的show函數(shù)
    void show() {
        cout << "MainActivity1 show" << endl;
    }

};

int main() {
    // 這個(gè)是優(yōu)先尋找子類的函數(shù),因?yàn)樘貏e明確,沒有問題凰荚,還沒有產(chǎn)生歧義(二義性)
    MainActivity1 mainActivity1; // 子類
    mainActivity1.onCreate();
    mainActivity1.onStart();
    mainActivity1.showSonInfo();

    // error: request for member 'show' is ambiguous
    // 不明確燃观,二義性,歧義
    // mainActivity1.show();

    // 解決方案一: 明確指定父類 ::
    mainActivity1.BaseActivity3::show();
    mainActivity1.BaseActivity2::show();
    mainActivity1.BaseActivity1::show();

    // 解決方案二: 子類上 重寫父類的show函數(shù)
    mainActivity1.show();

    return 0;
}

多繼承 二義性2:(鉆石問題)

在真實(shí)開發(fā)過程中便瑟,嚴(yán)格避免出現(xiàn) 二義性

#include <iostream>

using namespace std;

// 祖父類
class Object {
public:
    int number;
};

// 父類1
class BaseActivity1 : public Object {

};

// 父類2
class BaseActivity2 : public Object {

};

// 子類
class Son : public BaseActivity1, public BaseActivity2 {

    // 第二種解決方案: 在類中定義同名成員缆毁,覆蓋掉父類的相關(guān)成員
public:
    int number;

};


int main() {
    Son son;

    // error: request for member 'show' is ambiguous  二義性 歧義
    // son.number = 2000;

    // 第一種解決方案: :: 明確指定
    son.BaseActivity1::number  = 1000;
    son.BaseActivity2::number  = 1000;

    // 第二種解決方案: 在類中定義同名成員,覆蓋掉父類的相關(guān)成員
    son.number = 3000;

    // 第三種解決方案: 【虛基類】 屬于 虛繼承的范疇

    return 0;
}

【虛基類】 屬于 虛繼承的范疇

真實(shí)C++開始到涂,是很少出現(xiàn)脊框,二義性(歧義) 如果出現(xiàn), 系統(tǒng)源碼(系統(tǒng)用解決方案)

#include <iostream>

using namespace std;

// 祖父類
class Object{
public:
    int number;
    void show() {
        cout << "Object show run..." << endl;
    }
};

// 等下講 virtual 的原理是什么 ...

// 父類1
class BaseActivity1 : virtual public Object {
// public:int number; // 人為制作二義性  error: request for member 'number' is ambiguous
};

// 父類2
class BaseActivity2 : virtual public Object {
// public:int number;
};

// 子類
class Son : public BaseActivity1, public BaseActivity2 {

};

int main() {
    Object object;
    BaseActivity1 baseActivity1;
    BaseActivity2 baseActivity2;
    Son son;

    object.number = 100;
    baseActivity1.number = 200;
    baseActivity2.number = 300;
    son.number = 400;

    object.show();
    baseActivity1.show();
    baseActivity2.show();
    son.show();

    cout << object.number << endl;
    cout << baseActivity1.number << endl;
    cout << baseActivity2.number << endl;
    cout << son.number << endl;

    return 0;
}

繼承構(gòu)造和析構(gòu)函數(shù)的順序關(guān)系

// 補(bǔ)充點(diǎn): 繼承關(guān)系的時(shí)候践啄,構(gòu)造函數(shù)和析構(gòu)函數(shù) 的順序問題

#include <iostream>

using namespace std;

class Person {
public:
    string name;

    Person(string name) : name(name) {cout << "Person構(gòu)造函數(shù)" << endl;}

    ~Person()  {cout << "Person析構(gòu)函數(shù)" << endl;}

    virtual void test() {
        cout << "父 test..." << endl;
    }
};

class Student : public Person {
public:
    string name;

    Student(string name) : Person(name) {
        cout << "Student構(gòu)造函數(shù)" << endl;

        // Person::test();
    }

    ~Student()  {cout << "Student析構(gòu)函數(shù)" << endl;}

    void test() {
        cout << "子 test..." << endl;
    }
};

int main() {
    Student student("David");
    // Person構(gòu)造函數(shù)
    // Student構(gòu)造函數(shù)
    // Student析構(gòu)函數(shù)
    // Person析構(gòu)函數(shù)

    Student student1("A");
    student1.test();

    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浇雹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子屿讽,更是在濱河造成了極大的恐慌昭灵,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伐谈,死亡現(xiàn)場離奇詭異烂完,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诵棵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門抠蚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人非春,你說我怎么就攤上這事』和溃” “怎么了奇昙?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敌完。 經(jīng)常有香客問我储耐,道長,這世上最難降的妖魔是什么滨溉? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任什湘,我火速辦了婚禮,結(jié)果婚禮上晦攒,老公的妹妹穿的比我還像新娘闽撤。我一直安慰自己,他們只是感情好脯颜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布哟旗。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闸餐。 梳的紋絲不亂的頭發(fā)上饱亮,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音舍沙,去河邊找鬼近上。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拂铡,可吹牛的內(nèi)容都是我干的壹无。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼和媳,長吁一口氣:“原來是場噩夢啊……” “哼格遭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起留瞳,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤拒迅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后她倘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧微,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年硬梁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了前硫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荧止,死狀恐怖屹电,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跃巡,我是刑警寧澤危号,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站素邪,受9級(jí)特大地震影響外莲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兔朦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一偷线、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沽甥,春花似錦声邦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽英融。三九已至,卻和暖如春歇式,著一層夾襖步出監(jiān)牢的瞬間驶悟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工材失, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痕鳍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓龙巨,卻偏偏與公主長得像笼呆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旨别,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎诗赌,感謝一直在我身邊的親朋好友。感恩相遇秸弛!感恩不離不棄铭若。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,551評(píng)論 0 11
  • 彩排完递览,天已黑
    劉凱書法閱讀 4,187評(píng)論 1 3
  • 沒事就多看看書叼屠,因?yàn)楦褂性姇鴼庾匀A,讀書萬卷始通神绞铃。沒事就多出去旅游镜雨,別因?yàn)闆]錢而找借口,因?yàn)橹灰闶〕詢€用儿捧,來...
    向陽之心閱讀 4,774評(píng)論 3 11
  • 表情是什么荚坞,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息菲盾。高興了當(dāng)然就笑了颓影,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,154評(píng)論 2 7