C++ 继承(一)
C++继承的标准写法:
classBaseMonster{public:stringname;stringskill;uint32_thp;voidattack(){cout<<"Base::发动***"<<endl;}};classRedDemonKing:publicBaseMonster{};
解析:
① 类 RedDemonKing 集成了 类BaseMonster
② 集成的限定词为 public->
③ 对限定词的解析->
采用降级处理 : 级别从高到低(降序) public , protected , private 。如采用public,则基类中比public高的成员,全部降一级(因为没有比public高的级别 , 所以都不降级。但是protected的话 , 基类中的public在子类中的访问级别就降了一级变成protected)。
④ 如果省略继承的限定词,则默认为private限定词。
具体:
一,继承构造函数的调用顺序->先调用父类的构造函数,再调用子类(自己)的构造函数
1,当基类的构造函数为无参构造:
#include<iostream>usingnamespacestd;classBaseMonster{public:stringname;stringskill;uint32_thp;voidattack(){cout<<"Base::发动***"<<endl;}};classRedDemonKing:publicBaseMonster{};intmain(){RedDemonKingrdk;rdk.name="赤妖王";cout<<rdk.name<<endl;return0;}
2,当基类有有参数的构造函数时:
#include<iostream>usingnamespacestd;classBaseMonster{public:stringname;stringskill;BaseMonster(stringname){this->name=name;}voidattack(){cout<<"Base::发动***"<<endl;}};classRedDemonKing:publicBaseMonster{public:RedDemonKing(stringname):BaseMonster(name){this->skill="会心一击";}};intmain(){RedDemonKingrdk("赤妖王");cout<<rdk.name<<endl;return0;}
解析:
① RedDemonKing( string name ) : BaseMonster(name) , 以此格式(参数列表)为调用基类构造。
二,覆盖
#include<iostream>usingnamespacestd;classBaseMonster{public:stringname;stringskill;BaseMonster(stringname){this->name=name;}voidattack(){cout<<"Base::发动***"<<endl;}};classRedDemonKing:publicBaseMonster{public:stringname;RedDemonKing(stringname):BaseMonster(name){this->name="赤妖王";this->skill="会心一击";}};intmain(){RedDemonKingrdk("妖怪");cout<<rdk.name<<endl;cout<<rdk.BaseMonster::name<<endl;return0;}
解析:
① 当子类和基类有相同名字的成员如上(name),那么子类的name就对积累的name形成了覆盖(相当与作用域)
② 默认取值 rdk.name , 取得是子类(自己)的值 。 如果要取基类的值需指定域 : rdk.BaseMonster::name
③ 重点 , 只要是名字一样都会形成覆盖,不存在重载:
要调用基类的函数 必须指定域
firend(友元)不能被继承( 可以这么理解 : 父亲的朋友 , 不一定是自己的朋友 )
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。