c++第七天--继承与派生

  • 主要内容
  • 继承的概念
  • 继承的方式
  • 类型兼容

继承的概念

继承是面向对象编程的核心概念之一,它允许我们基于现在的类(称为基类或父类)创建新的类(称为派生类或子类)。派生类自动获得基类的所有特性(属性与方法)。同时可以对其添加新的特性或修改继承带来的特性

cpp 复制代码
class 派生类名 : 继承方式 基类名 {
    // 派生类的成员定义
};

一般是这种形式。

继承方式

C++提供了三种继承方式:

  1. public(公有继承)
  2. protected(保护继承)
  3. private(私有继承)

最常用的是公有继承,它保持了基类成员的访问权限。

这是一个简单的公有继承的办法

cpp 复制代码
#include<iostream>
using namespace std;
//基类
class Person{
public:
    string name;
    int age;

    void display(){
        cout << "姓名: " << name << ",年龄" << age << endl;
    }
};
//派生类
class Student : public Person{
public:
    int studentID;

    void study(){
        cout << name << "正在学习" << endl;
    }
};

int main()
{
    Student s;
    s.name = "张三";
    s.age  = 20;
    s.studentID = 10001;

    s.display();
    s.study();

    return 0;
}

继承:派生类(子类)自动获得基类(父类)的属性和方法,避免重复编码。

基类:被继承的类

派生类:继承基类的类

class 派生类名 : 继承方式 基类名 {

// 新增成员或重定义基类成员

};

继承的方式:

cpp 复制代码
#include<iostream>
using namespace std;

class Student{
public:
    void setGrade(string name);
    string getGrade();
    void setName(string name);
    string getName();
protected:
    string _grade;
private:
    string _name;
};

class Undergraduate : public Student
{
public:
    Undergraduate(string major);    //声明构造函数
    void show();
private:
    string _major;
};

void Student :: setGrade(string grade){
    _grade = grade;
}
string Student::getGrade(){
    return _grade;
}

void Student :: setName(string name){
    _name = name;
}
string Student :: getName()
{
    return _name;
}

Undergraduate::Undergraduate(string major){
    _major = major;
}
void Undergraduate::show()
{
    cout << "姓名" << getName() << endl;
    cout << "年级" << _grade << endl;
    cout << "专业:" << _major << endl;
}

int main()
{
    Undergraduate stu("计算机信息工程");	//创建大学生类对象stu
    stu.setGrade("大三");			//派生类对象调用基类成员函数设置年级
    stu.setName("zhangsan");		//派生类对象调用基类成员函数设置姓名
    stu.show();				//派生类对象调用新增成员函数显示学生信息
    return 0;

}

基类的public成员在派生类中仍为public,可被外部访问。

保护继承:基类的public和protected成员在派生类中变为protected,只能被派生类及其子类访问

私有继承:基类的public和protected成员在派生类中变为private,外部不可访问,子类也不可访问(仅限当前派生类使用)。

类型兼容

在公有继承下,派生类对象可当作基类对象使用,支持以下三种场景:

赋值兼容:派生类对象直接赋值给基类对象。

指针兼容:派生类对象的地址可赋给基类指针。

引用兼容:派生类对象可绑定到基类引用。

cpp 复制代码
#include<iostream>
using namespace std;

class Base{
public:
    Base();
    void show();
protected:
    string _name;
};

class Derive : public Base{
public:
    Derive();
    void display();
};

Base::Base() : _name("base") {}
void Base :: show(){
    cout << _name << "Base show()" << endl;
}
Derive :: Derive() {_name = "derive";}

void Derive :: display(){
    cout << _name << "Derive show()" << endl;
}

void func(Base* phase){
    phase->show();
}

int main()
{
    Derive derive;
    Base base = derive;
    Base& qbase = derive; //使用对象derive作为Base类对象的引用qbase赋值
    Base* pbase = &derive;//使用对象derive作为Base类指针pbase赋值
    base.show();  //通过base类对象调用show函数
    qbase.show();  //通过base类对象引入调用
    pbase->show(); //运用base类指针调用
    func(&derive);  //取对象derive的地址作为func()函数的参数
    return 0;
}
相关推荐
九转成圣7 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
SmartRadio7 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
laowangpython7 小时前
Rust 入门:GitHub 热门内存安全编程语言
开发语言·其他·rust·github
我叫汪枫7 小时前
在后台管理系统中,如何递归和选择保留的思路来过滤菜单
开发语言·javascript·node.js·ecmascript
_.Switch7 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
软件技术NINI7 小时前
webkit简介及工作流程
开发语言·前端·javascript·udp·ecmascript·webkit·yarn
Brendan_0017 小时前
JavaScript的Stomp.over
开发语言·javascript·ecmascript
念2347 小时前
f5 shape分析
开发语言·javascript·ecmascript
苍穹之跃7 小时前
某量JS逆向
开发语言·javascript·ecmascript
思茂信息7 小时前
CST软件如何进行参数化扫描?
运维·开发语言·javascript·windows·ecmascript·软件工程·软件需求