前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++基础继承(is-A)

C++基础继承(is-A)

作者头像
羊羽shine
发布2019-05-28 13:27:44
3960
发布2019-05-28 13:27:44
举报
文章被收录于专栏:Golang开发Golang开发

继承特点

  子类拥有父类的所有属性和方法(除了构造函数和析构函数)。   子类可以拥有父类没有的属性和方法。

继承语法

代码语言:javascript
复制
class 派生类名:继承方式 基类名1, 继承方式 基类名2,...,继承方式 基类名n
{
    派生类成员声明;
};

继承的访问控制

public继承:父类成员在子类中保持原有的访问级别(子类可以访问public和protected)。 private继承:父类成员在子类中变为private成员(虽然此时父类的成员在子类中体现为private修饰,但是父类的public和protected是允许访问的,因为是继承后改为private)。 protected继承 父类中的public成员会变为protected级别。 父类中的protected成员依然为protected级别。 父类中的private成员依然为private级别。 注意:父类中的private成员依然存在于子类中,但是却无法访问到。不论何种方式继承父类,子类都无法直接使用父类中的private成员。

继承中的构造函数

代码语言:javascript
复制
派生类名::派生类名(参数总表):基类名1(参数表1),基类名(参数名2)....基类名n(参数名n),内嵌子对象1(参数表1),内嵌子对象2(参数表2)....内嵌子对象n(参数表n)
{
    派生类新增成员的初始化语句;
}

  构造函数是为了初始类中的数据,对于派生类而言,不会继承基类的构造函数,因此为了完成派生类数据的初始化需要在派生类中自己定义构造函数,派生类的构造函数除了需要初始化派生类中新增的数据成员 还需要初始化基类中的数据成员

代码语言:javascript
复制
class student
{
  public:
    void display()
    {
        cout<<"ID: "<<s_ID<<" name : "<<name <<" age: "<<age <<endl;
    }
    student(int s_id,string s_name,int age)
    {
        s_ID = s_id;
        name = s_name;
        age = age;
    }
private:
    int s_ID;
    string name;
    int age;

};
class midStudent :public student
{
public:
    midStudent(int s_ID,string s_name,int age,int score):student(s_ID,s_name,age)
    {
        collegeScrore = score;
    }
    void  getCollegeScore()
    {
        cout<<"score :"<<collegeScrore<<endl;
    }
 private:
    int collegeScrore;

};


int main(int argc, char *argv[])
{
    midStudent stu(1,"baxiang",18,100);
    stu.display();
    stu.getCollegeScore();
    return 0;
}

覆写基类同名函数

  派生类中重新定义基类的同名函数的方法,成为对基类的函数的覆写,覆写后基类的同名函数在派生类中被隐藏,定义派生类对象调用该函数,调用的是自身的函数,基类的同名函数不会被调用。

  1. 若想调用基类的同名函数,可在函数前面加上基类的名称和作用域符号“::”
代码语言:javascript
复制
using  namespace std;
class Animal{
public:
    void speak(){
        cout<<"annimal lange!"<<endl;
    }
};

class Dog:public  Animal
{
public:
    void speak()
    {
        cout<<"dog language:anmial"<<endl;
    }
};

int main() {
    Dog dog;
    dog.speak();
    dog.Animal::speak();// 调用基类同名函数
    return 0;
}

多重继承构造函数

派生类的构造函数后面的参数包含了各干基类的构造函数需要的所有参数,多重继承派生类的构造函数需要调用该派生类的所有构造函数

代码语言:javascript
复制
类名:类名构造函数(参数列表):基类1构造函数(参数表1),基类2构造函数(参数表2)
{
  构造函数具体实现
}

多重继承调用顺序

  1. 调用基类构造函数,按照派生类中定义的先后顺序,依次调用
  2. 调用对象成员的构造函数
  3. 调用派生类的构造函数
代码语言:javascript
复制
 Bird(int fh){
        cout<<"Bird constructor"<<endl;
        m_flightAltitude = fh;
    }
 Fish(int speed)
    {
        cout<<"Fish constructor"<<endl;
        swim_speed = speed;
    }
 WaterBird(int fh, int speed):Bird(fh),Fish(speed)
    {
        cout<<"warerbird constructor"<<endl;
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 继承特点
  • 继承语法
  • 继承的访问控制
  • 继承中的构造函数
  • 覆写基类同名函数
  • 多重继承构造函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档