c++ 派生类向基类转换的可访问性

1.如果派生类以public继承基类,则是is a关系,用派生类可以完成基类的所有功能,所以可以在任意地方将派生类自动转换成基类,注意,这里都是指指针或引用,而不是对象。 比如:

class A{};class B:public A{}B b;void function(const A &);

这时就可以使用function(b),会默认把B类型转换成A类型。

解释:动态多态的内容

2.假定D继承B:

不论D以什么方式继承B,D的成员函数和友员函数都能使用派生类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员函数和友员函数来说永远是可访问的。

例如:

class B{}class D:private B                //这里以private或者protected或者public 都可以{void f(){B * base=new D;                      //编译正确}}

解释:前提说过:成员函数和友元函数的权限是最高的,派生类-->基类,也并不会造成数据不安全,所以可以。

如果不是成员函数(即用户代码),例如:

class B{};
class D:private B                //如果这里是public就可以,private或protected会错
{/*void f(){B * base=new D;                      }*/};
int main()
{B * b=new D;    //会出现编译错误,注意,这是用户代码
};

解释:如果B * b=new D;可以编译成功,是想干什么?显然是要多态,动态调用B类/D类的不同版本的函数。那么我们假设B类的一个public函数f,D类继承该函数f,但注意是private/protected,所以D类的f函数也对应的为:private或者protected。那么问题也就变成了另一个问题:用户代码可以调用一个类的private/protected成员函数吗?不可以阿!所以B * b=new D;这样写的目的(多态)是无法达到的,那么也就没有存在的意义,所以C++语法规定这种调用不能通过编译是合情合理的。

3.如果D继承B的方式是public或者protected,则D的派生类的成员或者友员可以使用D向B的类型转换;反之,如果D继承B的方式是private,则不能使用。

class B{};class D:public B{};//public或protected都可以class E:private D或者protected D或者public D{void f(){B *b=new D;              //可以编译通过D *d=new E;            //可以编译通过,这就是2介绍的情况。}};

解释:

只说第一行:B* b=new D;为什么能编译通过。逆向思维,为什么要这样写,这样能通过编译是为了做什么?肯定是要动态调用B或D类的不同版本函数(多态),对吧?假设B的一个public成员函数f,D类(public继承B)里是可以继承该f函数的,所以E类(继承于D,什么方式无所谓)也继承了D类的f函数,也就是说B类的f函数经过继承体系,最终在E类里可见,可以通过B类对象来调用这个f函数。所以B* b=new D;能编译成功,必然有其意义在,有意义才有存在的理由,不然就没有存在的价值。(有点哲学意味,但我认为这样反推是有道理的。)

但是如果变成private继承:

class B{};class D:private B{};class E:private D或者protected D或者public D{void f(){B *b=new D;              //错,不可以编译D *d=new E;            //可以编译,这就上2介绍的情况}};

解释:

只说第一行:B* b=new D;为什么无法通过编译。还是和上面一样的想法:B类有没有成员可以被E类调用/使用的?如果有,那么就应该可以编译成功,但是实际编译失败,那么我们来看看到底行不行:

假设B类的一个public成员函数f,在D类(private继承B)中,f函数可以继承于B类的,但属性变成了private。E类再继承D类,E类肯定无法继承D类的f函数了,对不对?(这时候就不要考虑B类了,这样想:D类是基类,有一个private成员函数f,E类继承于D类,E类显然继承不了这个f函数)也就是说,经过我们分析,B类的public成员都无法在E类中被调用/使用,更不用说B类的protected/private成员了。结论:由于B类的任何成员都无法被E类继承,那么E类中就不应该允许B *b=new D; 这样的调用存在,因为根本就没有任何成员/函数给它进行多态!

#include<iostream>  
using namespace std;  class A{};  class B:public A{};  
class C:protected A{};  
class D:private A{};  class E:public B{};  
class F:public C{};  
class G:public D{};  int main(){  A *pb, *pc, *pd, *pe, *pf, *pg;  pb = new B;     // 正确 public派生,可以转换[*B ---> *A].  pc = new C;     // 错误 protected派生,不可转换[*C -\-> *A].  pd = new D;     // 错误 private派生,不可转换[*D -\-> *A].  pe = new E;     // 正确 public派生的子类,可以转换[*E ---> *A].  pf = new F;     // 错误pg = new G;     // 错误 private派生的子类,不可转换[*G -\-> *A].  return 0;   
}

来自:https://www.cnblogs.com/FdWzy/p/12596238.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【代码】Python3|用Python PIL压缩图片至指定大小,并且不自动旋转

代码主体是GPT帮我写的&#xff0c;我觉得这个功能非常实用。 解决自动旋转问题参考&#xff1a;一行代码解决PIL/OpenCV读取图片出现自动旋转的问题&#xff0c;增加一行代码image ImageOps.exif_transpose(image) 即可恢复正常角度。 from PIL import Image, ImageOpsdef …

call,apply,bind

入参 call: 参数数量不固定。第一个参数指定了函数体内的this指向&#xff0c;从第二个参数开始往后&#xff0c;每个参数被依次传入函数。 apply: 接受两个参数。第一个参数指定了函数体内的this指向。第二个参数接受一个数组 [1,2]&#xff0c;但函数拿到的是解构后的入参 1…

spring-core:获取类/方法/字段/字段上直接定义的注解

AnnotatedElement.getAnnotation 如何获取一个类上定义的注解&#xff1f; 这个问题似乎不应该问&#xff0c;我们知道如果要获取一个类/方法/字段/字段上直接定义的注解是很方便的&#xff0c;如Class.getAnnotation(Class<CasbanScan>)就能实现, 只要实现了java.lang.…

Linux:Win10平台上,用VMware安装Centos7.x及系统初始化关键的相关配置(分步骤操作,详细,一篇足以)

VMware安装Centos7.x镜像的详细步骤&#xff1a;VMWare安装Centos系统&#xff08;无桌面模式&#xff09; 我这里是为了安装Hadoop集群&#xff0c;所以&#xff0c;以下这些步骤是必须进行的 如果你是学习Linux&#xff0c;可以跳过非必须的那些配置项 我安装的版本是&…

集群工具之HAProxy

集群工具之HAProxy HAProxy简介 它是一款实现负载均衡的调度器适用于负载特别大的web站点HAProxy的工作模式 mode http&#xff1a;只适用于web服务mode tcp&#xff1a;适用于各种服务mode health&#xff1a;仅做健康检查&#xff0c;很少使用 配置HAProxy client&#x…

jmeter--取样器-- HTTP请求

HTTP请求&#xff08;HTTP Request&#xff09; 右键 >>> 添加 >>> 取样器 >>> HTTP请求&#xff08;HTTP Request&#xff09;基本web服务器协议&#xff1a;https服务器名称或IP&#xff1a;端口号&#xff1a;443HTTP请求请求方式&#xff1a;路…

基于JAVA的机场航班起降与协调管理系统

毕业设计&#xff08;论文&#xff09;任务书 第1页 毕业设计&#xff08;论文&#xff09;题目&#xff1a; 基于JAVA的机场航班起降与协调管理系统 毕业设计&#xff08;论文&#xff09;要求及原始数据&#xff08;资料&#xff09;&#xff1a; 1&#xff0e;综述机场航班调…

【java配置】jpcap的下载与idea配置

解决报错&#xff1a;Cannot resolve symbol ‘jpcap’ 1. jpcap的下载 官网下载链接 百度网盘下载 双击WinpPca安装&#xff0c;jacap1和jpcap2任选其中之一 2. idea配置 &#xff08;1&#xff09;查看当前使用jdk目录 File -> Project Settings -> SDKs &#…

【1577】java网吧收费管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 网吧收费管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

项目实践---贪吃蛇小游戏(下)

对于贪吃蛇小游戏&#xff0c;最主要的还是主函数部分&#xff0c;这里就和大家一一列举出来&#xff0c;上一章已经写过头文件了&#xff0c;这里就不多介绍了。 首先就是打印桌面&#xff0c;也就是背景&#xff0c;则对应的代码为&#xff1a; void SetPos(short x, short …

查看 Oracle 表空间的使用情况

查看 Oracle 表空间的使用情况 一、查看表空间信息 SQL> select tablespace_name,file_name,user_bytes/1024/1024 sizeMB from dba_data_files order by tablespace_name;TABLESPACE_NAME FILE_NAME SIZEMB -------------------------…

MLLM | Mini-Gemini: 挖掘多模态视觉语言大模型的潜力

香港中文、SmartMore 论文标题&#xff1a;Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models Code and models are available at https://github.com/dvlab-research/MiniGemini 一、问题提出 通过更高分辨率的图像增加视觉标记的数量可以丰富…

Power BI 如何创建页面导航器?(添加目录按钮/切换页面按钮)

Power BI 中页导航是什么&#xff1f; 在Power BI中&#xff0c;页导航&#xff08;Page Navigation&#xff09;是指在报告中创建多个页面&#xff08;页&#xff09;&#xff0c;然后允许用户在这些页面之间进行导航的功能。 如下图所示&#xff0c;页导航的选项和报告中的…

嵌入式学习59-ARM8(中断,ADC,内核定时器和传感器)

什么是中断顶半部和底半部 &#xff1f; &#xff08;部分记忆&#xff09;背 上半部&#xff1a; …

计算机中浮点数的表示以及计算

网上关于这个问题的基础内容有很多文章了&#xff0c;比如&#xff1a;计算机组成原理_浮点数的表示与运算_浮点数左规右规是算术移位-CSDN博客 计算机系统基础&#xff1a;浮点数的表示 - 知乎 【计算机组成原理】1、浮点数的二进制表示、科学计数法、IEEE754标准_浮点数二进…

Atlas Vector Search:借助语义搜索和 AI 针对任何类型的数据构建智能应用

Atlas Vector Search已正式上线&#xff01; Vector Search&#xff08;向量搜索&#xff09;现在支持生产工作负载&#xff0c;开发者可以继续构建由语义搜索和生成式人工智能驱动的智能应用&#xff0c;同时通过 Search Node&#xff08;搜索节点&#xff09;优化资源消耗并…

Vue 2与Vue 3生命周期钩子的对比分析

一、概述 Vue 组件实例在创建时经历一系列初始化步骤&#xff0c;Vue 在合适的时机调用特定函数&#xff0c;允许开发者在特定阶段运行自己的代码&#xff0c;这些函数称为生命周期钩子。 二、规律 生命周期可分为四个阶段&#xff1a;创建、挂载、更新、销毁&#xff0c;每…

一些网络的常见问题

1. tcp和udp可以同时监听相同端口号吗&#xff1f; 答&#xff1a;可以。IP数据包首部有个叫协议字段&#xff0c;指出了上层协议是TCP还是UDP。 网络层读取数据包的时候&#xff0c;已经知道上层是什么报文&#xff0c;可以直接交给内核进程做区分处理。 2. 多个线程可以使用…

SpringCloud系列(12)--服务提供者(Service Provider)集群搭建

前言&#xff1a;在上一章节中我们成功把微服务注册进了Eureka集群&#xff0c;但这还不够&#xff0c;虽然注册服务中心Eureka已经是服务配置了&#xff0c;但服务提供者目前只有一个&#xff0c;如果服务提供者宕机了或者流量过大&#xff0c;都会影响到用户即服务使用者的使…

Java-GUI-AWT-布局

1 需求 Frame&#xff1a;默认布局是BorderLayoutDialog&#xff1a;默认布局是BorderLayoutPanel&#xff1a;默认布局是FlowLayout 2 接口 3 示例 在Java AWT&#xff08;Abstract Window Toolkit&#xff09;中&#xff0c;各种容器的默认布局方式如下&#xff1a; Frame…