派生类覆盖基类方法,在派生类调用基类方法,在派生类隐藏基类方法,将派生类复制给基类对象造成切除问题

本文主要是介绍派生类覆盖基类方法,在派生类调用基类方法,在派生类隐藏基类方法,将派生类复制给基类对象造成切除问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

派生类与基类

    • 派生类覆盖基类方法
    • 切除问题

派生类覆盖基类方法

在派生类中实现与基类方法名相同的方法,返回值和特征标都一样,在派生类中就相当于覆盖基类的该方法。

#include <iostream>
using namespace std;
class Fish{
private:bool isFreshWaterFish;
public:Fish(bool isFreshWater):isFreshWaterFish(isFreshWater){}void Swim(){if(isFreshWaterFish){cout<<"Swim in lake"<<endl;}else{cout<<"Swim in sea"<<endl;}}
} 
class Tuna:public Fish{
public:Tuna():Fish(false){}void Swim(){cout<<"Tuna swim in sea"<<endl;}
}
int main(){Tuna myTuna;myTuna.Swim();return 0;
}
输出:
Tuna swim in sea

那么如何在main()调用基类实现的,但是被派生类覆盖的方法?
需要使用作用域标识符(::)

Tuna myTuna;
myTuna.Fish::Swim();//调用基类中实现的方法
myTuna.Swim();//调用派生类实现的方法

那么又怎么在派生类中调用基类实现的方法?

Fish::Swim();

在派生类中隐藏基类的方法

#include <iostream>
using namespace std;class Fish{
private:bool isFreshWaterFish;
public:Fish(bool isFreshWater):isFreshWaterFish(isFreshWater){}void Swim(){cout<<"Swim in ..."<<endl;}void Swim(bool isFreshWater){if(isFreshWaterFish){cout<<"Swim in lake"<<endl;}else{cout<<"Swim in sea"<<endl;}}
} 
class Tuna:public Fish{
public:Tuna():Fish(false){}void Swim(){cout<<"Tuna swim in sea"<<endl;}
}
int main(){Tuna myTuna;myTuna.Swim();//myTuna.Swim(false);return 0;
}

其中myTuna.Swim(false);将会导致编译错误。由于派生类实现自己的Swim()方法,覆盖基类的Swim()方法以及重载方法。
解决方案有:

  1. 使用作用域表示符myTuna.Fish::Swim();
  2. 使用关键字using解除对Fish::Swim()的隐藏
class Tuna {public:using Fish::Swim;void Swim(){cout<<"Tuna swim in sea"<<endl;}
}
  1. 在派生类中实现基类所有重载的版本(Tuna类中覆盖Fish类)

切除问题

将一个派生类实例化对象,复制给其基类对象,编译器只复制基类所能承受的部分,这是一种无意间造成的裁剪数据,所以一般不要使用值传递,应该使用基类指针或者const引用的方式传递。

这篇关于派生类覆盖基类方法,在派生类调用基类方法,在派生类隐藏基类方法,将派生类复制给基类对象造成切除问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/486884

相关文章

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者