溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ 繼承(一)

發(fā)布時間:2020-07-12 03:20:59 來源:網絡 閱讀:409 作者:Aonaufly 欄目:編程語言

C++繼承的標準寫法:

class BaseMonster
{
public:
    string name;
    string skill;
    uint32_t hp;
    void attack()
    {
        cout << "Base :: 發(fā)動***" << endl;
    }
};
class RedDemonKing : public BaseMonster
{
} ;

解析:

① 類 RedDemonKing 集成了 類BaseMonster

② 集成的限定詞為 public->

    C++ 繼承(一)

③ 對限定詞的解析->

采用降級處理 : 級別從高到低(降序) public , protected , private 。如采用public,則基類中比public高的成員,全部降一級(因為沒有比public高的級別 , 所以都不降級。但是protected的話 , 基類中的public在子類中的訪問級別就降了一級變成protected)。

④ 如果省略繼承的限定詞,則默認為private限定詞。


C++ 繼承(一)


具體:

一,繼承構造函數的調用順序->先調用父類的構造函數,再調用子類(自己)的構造函數

1,當基類的構造函數為無參構造:

#include <iostream>
using namespace std;
class BaseMonster
{
public:
    string name;
    string skill;
    uint32_t hp;
    void attack()
    {
        cout << "Base :: 發(fā)動***" << endl;
    }
};
class RedDemonKing : public BaseMonster
{
} ;
int main()
{
    RedDemonKing rdk;
    rdk.name = "赤妖王";
    cout << rdk.name << endl;
    return 0;
}

2,當基類有有參數的構造函數時:

#include <iostream>
using namespace std;
class BaseMonster
{
public:
    string name;
    string skill;
    BaseMonster( string name )
    {
        this->name = name;
    }
    void attack()
    {
        cout << "Base :: 發(fā)動***" << endl;
    }
};
class RedDemonKing : public BaseMonster
{
public:
    RedDemonKing( string name ) : BaseMonster(name)
    {
        this->skill = "會心一擊";
    }
} ;
int main()
{
    RedDemonKing rdk("赤妖王");
    cout << rdk.name << endl;
    return 0;
}

解析:

① RedDemonKing( string name ) : BaseMonster(name)  , 以此格式(參數列表)為調用基類構造。


二,覆蓋

#include <iostream>
using namespace std;
class BaseMonster
{
public:
    string name;
    string skill;
    BaseMonster( string name )
    {
        this->name = name;
    }
    void attack()
    {
        cout << "Base :: 發(fā)動***" << endl;
    }
};
class RedDemonKing : public BaseMonster
{
public:
    string name;
    RedDemonKing( string name ) : BaseMonster(name)
    {
        this->name = "赤妖王";
        this->skill = "會心一擊";
    }
} ;
int main()
{
    RedDemonKing rdk("妖怪");
    cout << rdk.name << endl;
    cout << rdk.BaseMonster::name << endl;
    return 0;
}

解析:

① 當子類和基類有相同名字的成員如上(name),那么子類的name就對積累的name形成了覆蓋(相當與作用域)

② 默認取值 rdk.name , 取得是子類(自己)的值 。 如果要取基類的值需指定域 : rdk.BaseMonster::name

③ 重點 , 只要是名字一樣都會形成覆蓋,不存在重載:

    C++ 繼承(一)

要調用基類的函數 必須指定域


firend(友元)不能被繼承( 可以這么理解 : 父親的朋友 , 不一定是自己的朋友 )

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI