当前位置: 首页 > news >正文

C++——继承、权限对继承的影响

目录

继承基本概念

编程示例

1.基类(父类)Person

代码特点说明

权限对类的影响

​编辑

编程示例 

1. 公有继承 (public inheritance)

2. 保护继承 (protected inheritance)

3. 私有继承 (private inheritance)

重要规则

实际应用


继承基本概念

继承是面向对象编程(OOP)中的一个核心概念,特别是在C++中。它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的属性和方法。继承的主要目的是实现代码重用,以及建立一种类型之间的层次关系。

特点

1. 代码重用:子类继承了父类的属性和方法,减少了代码的重复编写。

2. 扩展性:子类可以扩展父类的功能,添加新的属性和方法,或者重写(覆盖)现有的方法(属性不能被重写或覆盖)。

3. 多态性:通过继承和虚函数,C++支持多态,允许在运行时决定调用哪个函数。

编程示例

C++中类的继承机制,定义了一个基类(Person)和两个派生类(Student和Teacher)。

基类(父类)Person

以下使用一个编程案例体验一下继承,如有一个 Person(表示人的基本信息)类,包含两个成员变量:name 和 age。创建两个 Student 和 Teacher 类,分别表示学生和老师。众所周知,不管是老师还是学生都是人,都有名字和年龄。如果给这两个类都声明成员变量: name 和 age ,就会显得繁琐,这里就可以使用继承,将 Person 作为父类,Student 和 Teacher 作为子类并且用公有权限继承 Person(父类),使 Student 和 Teacher 可以使用 Person 类里的成员变量,减少代码的重复编写。

#include <iostream>
#include <string>

using namespace std;  // 使用标准命名空间

// 基类(父类)Person - 表示人的基本信息
class Person
{
public:  // 公有访问权限
    string name;  // 姓名属性
    int age;      // 年龄属性
};

// 派生类(子类)Student - 继承自Person类,表示学生
class Student : public Person  // 公有继承方式
{
public:
    string occupation;  // 学生特有的职业属性

    // 打印学生信息的方法
    void printfStudentMsg()
    {
        // 可以访问从Person继承的name和age,以及自身的occupation
        cout << "职业:" << occupation << ",姓名:" << name 
             << ",年龄:" << age << endl;
    }
};

// 派生类(子类)Teacher - 继承自Person类,表示教师
class Teacher : public Person  // 公有继承方式
{
public:
    string occupation;  // 教师特有的职业属性

    // 打印教师信息的方法
    void printfTeacherMsg()
    {
        // 可以访问从Person继承的name和age,以及自身的occupation
        cout << "职业:" << occupation << ",姓名:" << name 
             << ",年龄:" << age << endl;
    }
};

int main()
{
    // 创建Student对象
    Student stu;
    
    // 设置学生属性
    stu.name = "李白";         // 设置继承自Person的name属性
    stu.age = 18;              // 设置继承自Person的age属性
    stu.occupation = "学生";    // 设置Student特有的occupation属性
    stu.printfStudentMsg();     // 调用Student的打印方法

    // 创建Teacher对象
    Teacher t;
    
    // 设置教师属性(修正了原始代码中的错误赋值)
    t.name = "张三";           // 设置继承自Person的name属性
    t.occupation = "教师";     // 设置Teacher特有的occupation属性
    t.age = 26;                // 设置继承自Person的age属性
    t.printfTeacherMsg();       // 调用Teacher的打印方法

    return 0;
}
代码特点说明
  1. 继承关系

    • Person是基类,包含人的基本属性(name和age)

    • StudentTeacher是派生类,通过公有继承(public Person)获得Person的所有public成员

  2. 派生类特点

    • 继承了基类的所有public成员(name和age)

    • 添加了自己的特有成员(occupation)

    • 定义了自己的成员函数(printfStudentMsg和printfTeacherMsg)

  3. 公有继承(public inheritance)特点:

    • 基类的public成员在派生类中仍然是public

    • 基类的protected成员在派生类中仍然是protected

    • 基类的private成员在派生类中不可直接访问

权限对类的影响

C++中,访问控制符对继承的影响可以通过下表来清晰地展示。这个表格展示了不同类型的继承( public protected private )如何影响基类的不同类型成员( public protected 、private )在派生类中的访问级别。

解释:

public 继承:基类的 public 成员在派生类中仍然是 public 的, protected 成员仍然是 protected 的。基类的 private 成员在派生类中不可访问。

protected 继承:基类的 public protected 成员在派生类中都变成 protected 的。基类的 private 成员在派生类中不可访问。

private 继承:基类的 public protected 成员在派生类中都变成 private 的。基类的 private 成员在派生类中不可访问。

这个表格提供了一个快速参考,帮助理解在不同类型的继承中基类成员的访问级别是如何变化的。记住,无论继承类型如何,基类的 private 成员始终不可直接在派生类中访问。

访问权限回顾

编程示例 

#include <iostream>
using namespace std;
//基类,父类
class Vehicle{ //交通工具,车,抽象的概念
public:
    string type;
    string contry;
    string color;
    double price;
    int numOfWheel;
protected:
    int protectedData;
private:
    int privateData;
public:
    void run(){
        cout << "车跑起来了" << endl;
    }
    void stop();
};
//私有继承测试
class TestClass : private Vehicle{
public:
    void tsetFunc(){
        price = 10; //基类的公有数据被私有继承后,在派生类中权限编程私有,只限在类内部使用
    }
};
//公有继承测试
class Truck : protected Vehicle{
public:
    void testFunc(){
        type = "数据测试"; //保持私有权限
        protectedData = 10; //保持私有权限
        privateData = 10; //报错了,基类的私有成员,不管哪种方式的继承都是不可访问的。
    }
};
//公有继承,基类的公有权限和保护权限不变,私有成员不能访问
class Bickle : public Vehicle{
public:
    void testFunc(){
        protectedData = 10;
    }
};
//派生类,子类
class Roadster : public Vehicle{ //跑车,也是抽象,比父类感觉上范围缩小了点
public:
    int stateOfTop;
    void openTopped();
    void pdrifting();
};
int main()
{
    TestClass test;
    test.price = 3.3; //报错了,基类的公有成员被私有继承后,降为私有权限
    Truck t;
    t.type = "测试"; //报错了,基类的公有成员被保护继承后,降为保护权限
    t.protectedData = 10; //从报错信息看出,保护继承造成基类的保护成员还是保持保护权限
    Roadster ftype;
    ftype.type = "捷豹Ftype";
    ftype.run();
    Bickle bike;
    bike.type = "死飞";
    bike.run();
    return 0;
}

1. 公有继承 (public inheritance)

class Roadster : public Vehicle
class Bickle : public Vehicle

特点:

  • 基类的public成员在派生类中保持public

  • 基类的protected成员在派生类中保持protected

  • 基类的private成员在派生类中不可访问

例子中Bickle类的testFunc()可以访问基类的protected成员protectedData

2. 保护继承 (protected inheritance)

class Truck : protected Vehicle

特点:

  • 基类的public和protected成员在派生类中都变为protected

  • 基类的private成员在派生类中不可访问

所以在Truck类外部:

Truck t;
t.type = "测试"; // 错误,type现在是protected
t.protectedData = 10; // 错误,protected成员不能在类外访问

3. 私有继承 (private inheritance)

class TestClass : private Vehicle

特点:

  • 基类的public和protected成员在派生类中都变为private

  • 基类的private成员在派生类中不可访问

所以在TestClass类外部:

TestClass test;
test.price = 3.3; // 错误,price现在是private

重要规则

  1. 无论哪种继承方式,基类的private成员在派生类中都不可直接访问

  2. 继承方式决定了基类成员在派生类中的访问权限:

    • 公有继承:保持原权限

    • 保护继承:public→protected

    • 私有继承:public/protected→private

实际应用

  • 公有继承是最常用的,表示"是一个"的关系

  • 保护继承和私有继承较少使用,通常用于实现细节的隐藏

  • 在派生类内部,可以访问基类的public和protected成员(取决于继承方式)

虚函数

相关文章:

  • ubuntu学习day1
  • RuoYi-Vue升级为https访问-后端安装SSL证书(单台Linux服务器部署)
  • 图论基础理论
  • 低资源需求的大模型训练项目---调研0.5B大语言模型
  • 2025.04.13【Density 2d】| 基因表达数据可视化
  • Linux编程c/c++程序
  • 前端vue 项目px转为rem的自适应解决方案
  • open harmony多模组子系统分析
  • BM25、BGE以及text2vec-base-chinese的区别
  • [dp8_子数组] 乘积为正数的最长子数组长度 | 等差数列划分 | 最长湍流子数组
  • UE5角色状态机中跳跃落地移动衔接问题
  • markdown导出PDF,PDF生成目录
  • goc知识点
  • Symbol
  • C++学习之路,从0到精通的征途:string类的模拟实现
  • 操作系统基础:06 操作系统历史
  • C++ CUDA开发入门
  • VectorBT量化入门系列:第六章 VectorBT实战案例:机器学习预测策略
  • vue3动态路由
  • Cyber Weekly #51
  • 聚焦智能浪潮下的创业突围,“青年草坪创新创业湃对”走进北杨人工智能小镇
  • 以色列在加沙发起新一轮强攻,同步与哈马斯展开无条件谈判
  • 聚焦中华文明精神标识,多校专家学者跨学科对话交流
  • 天问二号探测器顺利转入发射区
  • 大学2025丨北大教授陈平原:当卷不过AI时,何处是归途
  • 上海国际碳中和博览会下月举办,首次打造民营经济专区