该博文仅用于交流学习。请慎用于不论什么商业用途。本博主保留对该博文的一切权利。

博主博客: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,方法重写与方法隐藏的更多相关文章

  1. 前端学习笔记汇总(之merge方法)

    学习笔记 关于Jquery的merge方法 话不多说,先上图 使用jquery时,其智能提示如上,大概意思就是合并first和second两个数组,得到的结果是first+(second去重后的结果) ...

  2. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

  3. Go学习笔记07-结构体与方法

    Go学习笔记07-结构体与方法 Go语言 面向对象 结构的定义与创建 面向对象 Go语言只支持封装,不支持继承和多态. Go语言中只有struct,即结构体:没有class. 结构的定义与创建 pac ...

  4. Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. 方法重写和方法重载;this关键字和super关键字

    1:方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象. 方法重载: 同一个类中,出现的方法名相同,参数列表不同的现象. 方法重载能改变 ...

  6. Java中方法重写和方法重载

     首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的.至于面向对象的继承和多态的特性我就不在这里多说了.继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私 ...

  7. Java方法重写与方法重载

    方法重载:发生在同一个类中,方法名相同方法形参列表不同就会重载方法. 方法重写:发生在继承当中,如果子的一个类方法与父类中的那个方法一模一样(方法名和形参列表一样),那么子类就会重写父类的方法. 方法 ...

  8. Java SE学习笔记 --->高级类特性 ---> toString() 方法

    概述: toString() 方法在面向对象当中十分常见,使用频率很高,和equals() 方法一样,也是Object类中定义的方法. jdk中 源码: java.lang.Object类中ToStr ...

  9. [C#学习笔记]分部类和分部方法

    知识在于积累. 前言 好久没写博客了,因为在看<CLR via C#>的时候,竟然卡在了分部方法这一小节几天没下去.今天重新认真阅读,有些感悟,所以在此记录. 然后. 每天早晨第一句,&l ...

随机推荐

  1. POI不同版本替换Word模板时的问题

    一.问题描述 通过POI,把Word中的占位符替换为实际的值,以生成复杂结构的业务报告. 在POI 3.9上,功能正常.由于某些原因升级到POI 3.10.1后,项目组反馈说Word模板出错,无法生成 ...

  2. 让普通 Java 类自动感知 Activity Lifecycle

    背景 在 Android 开发中,我们都很熟悉 Activity 的 Lifecycle,并且会在特定的 Lifecycle 下执行特定的操作.当然,我们清楚 Lifecycle 本身是带有 Andr ...

  3. Linux网络中接收 "二进制" 流的那些事 --- 就recv的返回值和strlen库函数进行对话

    1.    前言 很多朋友在做网络编程开发的时候可能都遇到这样的问题,在进行接收二进制流的数据的时候,使用strlen库函数来得到 二进制数据长度的时候并不准确.为什么呢??首先,使用strlen进行 ...

  4. java.io.File类操作

    一.java.io.File类 String path="E:/222/aaa";//路径 String path1="aaa.txt"; File file= ...

  5. Linux下安装ActiveMQ CPP

    ActiveMQ CPP ActiveMQ CPP是用C++语言访问ActiveMQ的客户端开发库,也称cms(cpp message service),安装cms开发库需要先安装一些基础库. 如下: ...

  6. File I/O

    File I/O Introduction     We'll start our discussion of the UNIX System by describing the functions ...

  7. iOS 远程推送消息解析及逻辑处理

    关于远程推送的相关配置网上已经有足够多的教程,这里就不复述了.这里讲述当客户端收到推送消息后,应怎样对其进行相应的逻辑处理. 工程的AppDelegate.m文件里提供了如下方法: //当应用程序启动 ...

  8. MSSQL-并发控制-2-Isolation

              如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!   MySQL通过MVCC和锁来实现并发控制,在4 ...

  9. 【复习】VueJS之内部指令

    Vuejs 源码:https://github.com/zhuangZhou/vuejs 下载Vue.js 官网:http://vuejs.org live-server使用 live-server是 ...

  10. pyhton 关于 configparser 配置 模块 实践使用中碰到的坑

    今天做一个ATM的练习,想要用configparser模块,写一个配置文件,存放用户信息. 结果状况连连,叫苦不迭. 我用configparser模块,想要对配置文件,进行读.写.改.查 功能. 其中 ...