C++学习笔记24,方法重写与方法隐藏
该博文仅用于交流学习。请慎用于不论什么商业用途。本博主保留对该博文的一切权利。
博主博客:http://blog.csdn.net/qq844352155
转载请注明出处:
方法重写.是指在子类中又一次编写父类中的虚函数的实现.要求子类中的函数必须跟父类中的原型一致.
包含返回值类型(协变返回类型不算)以及參数的数目,排列顺序.
#include <iostream>
#include <string>
using namespace std;
class base{
public:
virtual void show(int i,string s){
cout<<i<<"+"<<s<<endl;
cout<<"This is base show!"<<endl;
}
};
class dirved:public base{
public:
virtual void show(int i,string s){
cout<<i<<"&"<<s<<endl;
cout<<"This is dirved show!"<<endl;
}
}; int main(){
base b;
b.show(10,"base");
dirved d;
d.show(20,"dirved");
}
通过方法的重写,就可以定义同一函数在继承层次中的不同行为!
假设在子类中使用父类虚方法的名称,可是參数不同,那么这个不是重写父类的方法,也不会重载方法,而是创建一个新方法.
#include <iostream>
#include <string>
using namespace std;
class base{
public:
virtual void show(int i,string s){
cout<<i<<"+"<<s<<endl;
cout<<"This is base show!"<<endl;
}
};
class dirved:public base{
public:
/*
virtual void show(int i,string s){
cout<<i<<"&"<<s<<endl;
cout<<"This is dirved show!"<<endl;
}*/
virtual void show(){
cout<<"This is void dirved show!"<<endl;
}
}; int main(){
base b;
b.show(10,"base");
dirved d;
//d.show(20,"dirved");
d.show();
}
这个时候,父类中的show()方法将被隐藏,即dirved类中无法再使用show(int,string)方法.
#include <iostream>
#include <string>
using namespace std;
class base{
public:
virtual void show(int i,string s){
cout<<i<<"+"<<s<<endl;
cout<<"This is base show!"<<endl;
}
};
class dirved:public base{
public:
/*
virtual void show(int i,string s){
cout<<i<<"&"<<s<<endl;
cout<<"This is dirved show!"<<endl;
}*/
virtual void show(){
cout<<"This is void dirved show!"<<endl;
}
}; int main(){
base b;
b.show(10,"base");
dirved d;
d.show(20,"dirved");
d.show();
}
编译结果:
能够看出,对于dirved类来说,show(int,string)这种方法被隐藏起来了,即对于dirved对象来说不可见了!因此仅仅要在子类中又一次定义了父类的虚方法,父类中的全部与该方法重载的方法都将被隐藏!
这一点须要特别注意!
以下再看一些有趣的东西:
#include <iostream>
#include <string>
using namespace std;
class base{
public:
virtual void show(int i,string s){
cout<<i<<"+"<<s<<endl;
cout<<"This is base show!"<<endl;
}
};
class dirved:public base{
public:
virtual void show(int i,string s){
cout<<i<<"&"<<s<<endl;
cout<<"This is dirved show!"<<endl;
}
}; int main(){ dirved d;
d.show(10,"show()");
base &ref=d;
ref.show(100,"ref show()");
}
子类中正确的重写了父类中的show方法,
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
结果没有疑问.可是假设你重写子类的show方法的时候,发现应该用double取代int,于是i更改为
#include <iostream>
#include <string>
using namespace std;
class base{
public:
virtual void show(int i,string s){
cout<<i<<"+"<<s<<endl;
cout<<"This is base show!"<<endl;
}
};
class dirved:public base{
public:
virtual void show(double i,string s){
cout<<i<<"&"<<s<<endl;
cout<<"This is dirved show!"<<endl;
}
}; int main(){ dirved d;
d.show(10,"show()");
base &ref=d;
ref.show(100,"ref show()");
}
执行结果:
看到没有!最后那个ref.show(int,string)调用了base里面的show方法!(100能够换成9.8更明显)
明明是dirved对象的引用,怎么就调用了base里面的show方法呢?由于这实际上是创建了一个新方法!
可用overridekeyword来避免这样的情况!
#include <iostream>
#include <string>
using namespace std;
class base{
public:
virtual void show(int i,string s){
cout<<i<<"+"<<s<<endl;
cout<<"This is base show!"<<endl;
}
};
class dirved:public base{
public:
virtual void show(double i,string s)override{
cout<<i<<"&"<<s<<endl;
cout<<"This is dirved show!"<<endl;
}
}; int main(){ dirved d;
d.show(10,"show()");
base &ref=d;
ref.show(95.9,"ref show()");
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
override表示你是想要重写base类的show方法而不是创建一个新的show方法,因此假设參数不正确就会报错!
须要注意的是,即便是重写,仅仅要在子类中又一次定义了,父类中的对应重载函数都将会被隐藏!
假设不想既想使用父类中的show,又想重写某一个show(),能够利用using
#include <iostream>
#include <string>
using namespace std;
class base{
public:
virtual void show(int i,string s){
cout<<i<<"+"<<s<<endl;
cout<<"This is base show!"<<endl;
}
virtual void show(){
cout<<"this is a void show"<<endl;
}
};
class dirved:public base{
public:
//using
using base::show;
virtual void show(int i,string s)override{
cout<<i<<"&"<<s<<endl;
cout<<"This is dirved show!"<<endl;
}
}; int main(){ dirved d;
d.show(10,"show()");
base &ref=d;
ref.show(95.9,"ref show()");
d.show();
}
这样就两全其美啦!
C++学习笔记24,方法重写与方法隐藏的更多相关文章
- 前端学习笔记汇总(之merge方法)
学习笔记 关于Jquery的merge方法 话不多说,先上图 使用jquery时,其智能提示如上,大概意思就是合并first和second两个数组,得到的结果是first+(second去重后的结果) ...
- 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回
<深入Java虚拟机学习笔记>- 第19章 方法的调用与返回
- Go学习笔记07-结构体与方法
Go学习笔记07-结构体与方法 Go语言 面向对象 结构的定义与创建 面向对象 Go语言只支持封装,不支持继承和多态. Go语言中只有struct,即结构体:没有class. 结构的定义与创建 pac ...
- Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- 方法重写和方法重载;this关键字和super关键字
1:方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象. 方法重载: 同一个类中,出现的方法名相同,参数列表不同的现象. 方法重载能改变 ...
- Java中方法重写和方法重载
首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的.至于面向对象的继承和多态的特性我就不在这里多说了.继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私 ...
- Java方法重写与方法重载
方法重载:发生在同一个类中,方法名相同方法形参列表不同就会重载方法. 方法重写:发生在继承当中,如果子的一个类方法与父类中的那个方法一模一样(方法名和形参列表一样),那么子类就会重写父类的方法. 方法 ...
- Java SE学习笔记 --->高级类特性 ---> toString() 方法
概述: toString() 方法在面向对象当中十分常见,使用频率很高,和equals() 方法一样,也是Object类中定义的方法. jdk中 源码: java.lang.Object类中ToStr ...
- [C#学习笔记]分部类和分部方法
知识在于积累. 前言 好久没写博客了,因为在看<CLR via C#>的时候,竟然卡在了分部方法这一小节几天没下去.今天重新认真阅读,有些感悟,所以在此记录. 然后. 每天早晨第一句,&l ...
随机推荐
- ⑧bootstrap组件 文字图片 下拉菜单 按钮组 使用基础案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- asp.net core 开发的https证书服务-agilelabs.net
创建证书-生成CSR(Certificate Sign Request): 填写证书基本信息 接下来我们就可以看到创建的证书签名请求信息(CSR): 为我们刚才创建的CSR签名: 签名的意思是说通过证 ...
- linux分析日志的一些常用方法
head -n 2016_05_23_access_log |grep "/859" 显示前10000行中包含 /859 的记录 增加 |wc -l 则改为输出记录数 cat 2 ...
- main之前初始化流程
main之前初始化流程 本文分别介绍Keil调用的ARMCC以及ARM-NONE-EABI-GCC两个编译器在main之前的操作: Keil MDK启动文件 总结一下MDK的启动流程: 1.系统初始化 ...
- ContextLoaderListener - 运行原理
基本概念: servletContext:http://blog.csdn.net/yjw757174266/article/details/45072975 1. 使用ContextLoaderL ...
- tomcat不编译webapps下的war包的解决办法
1.首先看看tomcat是否能正常启动,如果启动tomcat一闪而过那么就使用dos命令启动tomcat看看报什么错 如果是端口占用的错误.使用netstat -ano命令查看占用端口的程序 然后用任 ...
- Python ---------- Tensorflow (二)学习率
假设最小化函数 y = x2 , 选择初始点 x0= 5 1. 学习率为1的时候,x在5和-5之间震荡. #学习率为1 import tensorflow as tf training_steps = ...
- Java build path && Deployment assembly && 编译路径 && 发布路径
java build path java源文件,编译后,输出的路径,默认值为: *此时的源码文件夹在 /src deployment assembly 系统发布路径设置,将完成(或未完成)的项目对应的 ...
- Django 入门案例开发(下)——创建项目应用及模型类
前面两章是在已经开发好的项目上用来描述环境和业务,这一章创建一个全新的项目来用作开发,你可以跟着我的步骤进行开发,如果有不理解的地方可以给我留言. 今天的任务是创建好项目和用户(users)应用及让它 ...
- 从今天起开始记录下在freecodecamp学习的一些tip吧(所有内容都在这个随笔的评论里面记录)
因为可能东西会很零碎 所以就放在随笔里吧 当需要在字符串中使用一个: " 或者 ' 时 可以通过在引号前面使用 反斜杠 (\) 来转义引号. var sampleStr = "Al ...