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

博主博客: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. 对象作为 handleEvent

    elem.addEventListener("click", obj, false);    //用对象作为处理函数   var obj = {     handleEvent: ...

  2. HBase流量限制和表负载均衡剖析

    1.概述 在HBase-1.1.0之前,HBase集群中资源都是全量的.用户.表这些都是没有限制的,看似完美实则隐患较大.今天,笔者就给大家剖析一下HBase的流量限制和表的负载均衡. 2.内容 也许 ...

  3. Python 解决面试题47 不用加减乘除做加法

    在看<剑指Offer>过程中,面试题47不用加减乘除做加法,给出的思路是使用二进制的异或以及与运算,总之就是使用二进制.但是在使用Python实现的过程中,对于正整数是没有问题的,但是对于 ...

  4. 一:详解 HTTP 协议

    本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 TCP/IP 协议族进行网络通信 ...

  5. SimpleMembership

    最近2个月以来,一直在学习MVC,从最开始的2,一直到最新的4.从原来的aspx到现在的Razor引擎,越学越开心,越学越上瘾. 最近为新项目做准备,打算用MVC4,VS2012+SQL2012,反正 ...

  6. HTML5技术分享 ES2017继发与并发

    大家都知道,async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了.你可以用then方法指定下一步的操作. 进一步说,async函数完 ...

  7. Redis 图形化监控方案 RedisLive 介绍

    作为一款开源的 Redis 图形化监控工具,RedisLive 提供对 Redis 实例的内存使用情况,接收的客户端命令,接收的请求数量以及键进行监控.RedisLive 的工作原理基于 Redis ...

  8. 用Python写一款属于自己的 简易zip压缩软件 附完成图(适合初学者)

    一.软件描述 用Python tkinter模块写一款属于自己的压缩软件.zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile来操作zip文件,具有功能:zip压缩功能,zip ...

  9. 巧学DBhelper

    这几天在教我很重要的人学习,她属于那种超级小白,很超级的那种. 教她的过程中 发现有的知识点 不管这么教都不会.DBhelper就是不知道怎么记. 当时我就想到 杰哥(程杰)的出的大话系列,和他写书的 ...

  10. H5新增标签

    <!DOCTYPE html ><html><head><meta http-equiv="Content-Type" content=& ...