C++:继承-继承权限

server/2024/10/19 7:25:52/

在C++中,类的权限分为公有、私有和保护三种。这些权限控制了类的成员(数据成员和成员函数)对外部代码的可见性和访问性。

  1. 公有(public)权限

    在公有权限下声明的成员可以被类的外部代码直接访问;公有成员在类的派生类中仍然可以被访问。
  2. 私有(private)权限

    在私有权限下声明的成员对于外部代码是不可见的;只有类的成员函数可以访问私有成员;私有成员不能被派生类访问,即使是公有继承也是如此。
  3. 保护(protected)权限

    在保护权限下声明的成员对于外部代码是不可见的;类的派生类可以访问保护成员;保护成员在派生类中仍然是保护的,对于外部代码是不可见的。

在 C++类的继承中,也对应着三种继承权限,分别是公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。这些权限决定了派生类如何继承基类的成员以及外部访问的方式。

  1. 公有继承(public inheritance)

    在公有继承中,基类的公有成员在派生类中仍然是公有的,基类的保护成员在派生类中仍然是保护的,基类的私有成员不会被派生类继承。

    派生类对象可以直接访问基类的公有成员,但不能访问基类的私有成员。

    外部代码可以访问派生类对象中的公有成员,但不能访问保护成员或私有成员。

    //基类
    class Animal
    {
    public:Animal();~Animal();
    ​int m_nAge;
    ​
    private:int testA;
    protected:int testB;
    };
    ​
    //派生类(公有继承)
    class Cat : public Animal
    {
    public:Cat();~Cat();}

    上述代码中的派生类就属于通过对基类进行公有继承得到,此时Animal类中的公有成员被继承至Cat类中也是公有成员,Animal类的保护成员在Cat类中仍然是保护的,但是Animal类的私有成员不会被Cat类继承。如此时我在Cat类中对基类中的私有成员TestA和保护成员TestB进行设置/访问,那么此时可以发现私有成员TestA无法访问,保护成员TestB可以正常访问;是因为私有成员并没有被继承。

    总结:

    公有继承:基类                  派生类公有成员     --->       公有成员保护成员     --->       保护成员私有成员                无法继承
    
  2. 保护继承(protected inheritance)

    在保护继承中,基类的公有和保护成员在派生类中都变成了保护成员,类的私有成员依然不会被派生类继承。

    派生类对象可以访问基类的公有和保护成员,但外部代码无法直接访问派生类对象的成员。

    外部代码无法访问派生类对象中的任何成员。

    保护继承:

    //基类
    class Animal
    {
    public:Animal();~Animal();
    ​int m_nAge;
    ​
    private:int testA;
    ​
    protected:int testB;
    };
    ​
    //派生类(保护继承)
    class Cat : protected Animal
    {
    public:Cat();~Cat();
    }

    派生类 Cat:使用保护继承方式继承自 Animal 类,意味着基类 Animal 的公有和保护成员在 Cat 类中都变成了保护的。外部无法直接访问 Cat 对象的成员。Cat 类中可以访问继承自 Animal 的公有和保护成员。

总结:

保护继承基类                  派生类公有成员     ---->      保护成员保护成员     ---->      保护成员私有成员                无法继承

3.私有继承(private inheritance)

在私有继承中,基类的公有和保护成员在派生类中都变成了私有的,类的私有成员依然不会被派生类继承。

派生类对象可以访问基类的公有和保护成员,但外部代码无法直接访问派生类对象的成员。

外部代码无法访问派生类对象中的任何成员。

私有继承:

//基类
class Animal
{
public:Animal();~Animal();
​int m_nAge;private:int testA;
​
protected:int testB;
};
​
//派生类
class Cat : private Animal
{
public:Cat();~Cat();
}

派生类 Cat:采用私有继承方式继承自 Animal 类,这意味着基类 Animal 的公有和保护成员在 Cat 类中都变成了私有的。Cat 类中可以访问继承自 Animal 的公有和保护成员,但外部代码无法访问。

总结:

      私有继承

        基类                  派生类公有成员     --->      私有成员保护成员     --->      私有成员私有成员               无法继承


http://www.ppmy.cn/server/38257.html

相关文章

基于微信小程序的网上购物系统的设计与实现

基于微信小程序的网上购物系统的设计与实现 “Design and Implementation of an Online Shopping System based on WeChat Mini Program” 完整下载链接:基于微信小程序的网上购物系统的设计与实现 文章目录 基于微信小程序的网上购物系统的设计与实现摘要第一章 绪论1.1 研究…

AWTK 和 QT 资源占用不完全对比

因为没有开发两个完全一样的应用程序,对比的结果并不是很准确,仅供参考。 对比的程序为: AWTK demoui 演示了 AWTK 常用功能。 QT QDesktop 演示了 QT 常用功能。 运行平台为: i.MX6ULL Linux 1. 可以执行文件大小 1.1 AWTK…

Navigation常见场景解决方案

路由跳转场景 页面跳转是路由最常用的能力,Navigation通过NavPathStack提供了诸多方法,下文以pushDestination方法为例,介绍Navigation的路由跳转相关能力。 页面间跳转 NavPathStack提供了路由管理的能力,通过NavPathStack进行…

vue3封装获取当前年、月、季度、周

1.新建在utils文件夹中handleTime.js文件用于封装方法 // 计算当前周的开始和结束时间 export function calcNowWeek() {let startWeek moment().weekday(0).format(YYYY-MM-DD);startWeek moment(startWeek).subtract(2, days).format(YYYY-MM-DD)let endWeek moment().we…

kafka系列一:初识kafka

概述 kafka是由scala语言编写的一个分布式且具备高可用、高性能、可持久化、可水平扩展、支持流数据处理等众多特性的消息系统,常活跃于大数据生态中,而且大名鼎鼎的rocketmq就是参考了kafka的设计原理。 目前越来越多的开源分布式中间件都支持与kafka集…

第十三届蓝桥杯决赛(国赛)真题 Java B 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 重合次数试题 B: 数数试题 C: 左移右移试题 D: 窗口试题 E: 迷宫试题 F : \mathrm{F}: F: 小球称重试题 G: 背包与魔法试题 H: 修路试题 I: 围栏试题J: 好数 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&…

linux Nginx安装与启动

一、先到官网下载Nginx 官网地址: http://nginx.org/en/download.html 我下载的是nginx-1.20.2 二、下载好的文件上传到服务器,然后解压 1、上传到指定的服务器地址,我这里是公司服务器,目录都是定义好的,自己玩建…

密码口令初步

一,弱口令(ctfhub) 1.打开环境,发送到bp的instruder板块,一般id默认为admin,也可以用bp找出来,这里就是 2.先clear ,再把password等号后面添加进来(add)&am…