1. 程式人生 > >C++ 繼承(一)

C++ 繼承(一)

c++ 繼承(一)

C++繼承的標準寫法:

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

解析:

① 類 RedDemonKing 集成了 類BaseMonster

② 集成的限定詞為 public->

技術分享

③ 對限定詞的解析->

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

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


技術分享


具體:

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

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

#include <iostream>
using namespace std;
class BaseMonster
{
public:
    string name;
    string skill;
    uint32_t hp;
    void attack()
    {
        cout << "Base :: 發動攻擊" << 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 :: 發動攻擊" << 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 :: 發動攻擊" << 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

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

技術分享

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


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

本文出自 “Better_Power_Wisdom” 博客,請務必保留此出處http://aonaufly.blog.51cto.com/3554853/1930500

C++ 繼承(一)