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

C++超详细知识点(四):类的继承和派生

目录

    • 标题:类的继承和派生
      • 1. 公有继承
      • 2. 保护继承
      • 3. 私有继承
      • 4. 问题:基类的私有成员在派生类中不可访问,那么怎么才能访问其父类(基类)的私有成员呢?
        • (1)使用公有/保护成员函数。
        • (2)使用友元函数或友元类。

标题:类的继承和派生

  类的继承和派生是一种机制,允许你创建一个新的类(称为子类或派生类),该类继承另一个已存在的类(称为基类或父类)的成员(属性和方法)。这使得你可以在新类中重用已有类的代码,并在其上添加新的功能或修改现有的功能。

例如:

#include <iostream>// 基类(父类)
class Animal 
{public:void eat() {std::cout << "Animal is eating." << std::endl;}void sleep() {std::cout << "Animal is sleeping." << std::endl;}
};// 派生类(子类),继承自 Animal
class Dog : public Animal 
{public:void bark() {std::cout << "Dog is barking." << std::endl;}
};int main() {// 创建派生类的对象Dog myDog;// 使用继承自基类的方法myDog.eat();myDog.sleep();// 新功能:调用派生类独有的方法myDog.bark();return 0;
}

继承的类型有三种:公有继承(public)、保护继承(protected)、私有继承(private)。
  在上述的例子中,我们使用的是公有继承(public Animal),这意味着基类的公共成员在子类中仍然是公共的。通常情况下,公有继承是最常见的类型,因为它维护了基类成员的可访问性。

1. 公有继承

使用 public 关键字表示,如 class Dog: public Animal。
  基类的公共成员在派生类中保持为公共成员,基类的保护成员在派生类中变为保护成员
  基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。

2. 保护继承

使用 protected 关键字表示,如 class Derived : protected Base。
  基类的公共成员和保护成员在派生类中都变为保护成员
  基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。

3. 私有继承

使用 private 关键字表示,如 class Derived : private Base。
  基类的公共成员保护成员在派生类中都变为私有成员
  基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。

例如:

class Base
{public:int publicMember;protected:int protectedMember;private:int privateMember;
};class Derived : public Base   //公有继承
{// publicMember 是公共的// protectedMember 变为派生类的保护成员// privateMember 在派生类中不可访问
};
class Derived : protected Base {  //保护继承// publicMember 变为派生类的保护成员// protectedMember 变为派生类的保护成员// privateMember 在派生类中不可访问
};
class Derived : private Base {  //私有继承// publicMember 变为派生类的私有成员// protectedMember 变为派生类的私有成员// privateMember 在派生类中不可访问
};

4. 问题:基类的私有成员在派生类中不可访问,那么怎么才能访问其父类(基类)的私有成员呢?

(1)使用公有/保护成员函数。

  在基类中提供公有或保护的成员函数,通过这些函数来访问私有成员。派生类可以调用这些函数来访问私有成员。

class Base 
{private:int privateMember;public:void setPrivateMember(int value) {privateMember = value;}int getPrivateMember() const {return privateMember;}
};class Derived : public Base 
{public:void accessPrivateMember() {setPrivateMember(42);        // 通过公有成员函数设置私有成员的值int value = getPrivateMember();  // 通过公有成员函数获取私有成员的值}
};
(2)使用友元函数或友元类。

   可以在基类中声明派生类为友元类,从而让派生类能够直接访问基类的私有成员。

class Derived;  // 前向声明,不然Base中无法识别到该类,类的声明必须在使用之前。
class Base
{private:int privateMember;// 声明 Derived 为友元类friend class Derived;
};class Derived : public Base 
{public:void accessPrivateMember() {// 可以直接访问基类的私有成员Base::privateMember = 42;}
};

  需要注意的是,尽管上述方法可以实现访问私有成员,但在面向对象的设计中,尽量避免直接访问基类的私有成员,以维护封装性和代码的可维护性。通常情况下,应该通过公有/保护的接口(成员函数)来间接访问基类的私有成员。

相关文章:

  • 【CMake】顶层 CMakeList.txt 常用命令总结
  • 电源模块测试常用设备与计算公式方法
  • SpringMVC03、HelloSpring
  • 轻量化云组态平台
  • JSONObject在Android Main方法中无法实例化问题
  • php7.3.4连接sqlserver(windows平台)
  • CMS与其他老年代垃圾回收器的区别?
  • OSPF协议
  • 爬虫与DataFrame对象小小结合
  • [创业之路-99/管理者与领导者-141] :绩效管理-1-绩效管理是一把手工程、是系统工程、是化繁为简工程
  • 【Flutter】IOS运行工程二次启动崩溃问题。
  • Transformer家族
  • 汽车IVI中控开发入门及进阶(十四):功能安全
  • Spring Boot+Vue前后端分离项目如何部署到服务器
  • 基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测
  • 2017前端实习生面试总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • js对象的深浅拷贝
  • MySQL几个简单SQL的优化
  • mysql中InnoDB引擎中页的概念
  • PHP那些事儿
  • Python_OOP
  • Service Worker
  • 我建了一个叫Hello World的项目
  • 硬币翻转问题,区间操作
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 我们雇佣了一只大猴子...
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C语言)共用体union的用法举例
  • (JS基础)String 类型
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (原)Matlab的svmtrain和svmclassify
  • (转)C#调用WebService 基础
  • (转)winform之ListView
  • (转)大型网站的系统架构
  • .gitignore
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core WebAPI中封装Swagger配置
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .Net各种迷惑命名解释
  • @angular/cli项目构建--Dynamic.Form
  • @Documented注解的作用
  • @EnableWebMvc介绍和使用详细demo
  • @font-face 用字体画图标
  • [20171106]配置客户端连接注意.txt
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [ajaxupload] - 上传文件同时附件参数值
  • [Assignment] C++1