c++中的overload、overwrite、override
作为初学者,本文只从语法和简单的使用角度对overload、overwrite、override进行了区分,不曾涉及原理,记录下来以供查阅。
1.verload(重载)
1.1 基本要求:
c++中的重载需要满足以下几个要求:
- 相同的作用域
- 函数名相同,参数列表不同,与返回值类型无关
例如:
void Fun()
{
}
void Fun(int n)
{
}
int Fun() //只是返回类型不同,不能构成重载
{
}
注意:同名的函数必须在相同的作用域内才构成重载。
1.2 类中成员函数
类中的普通成员函数构成重载要满足上面的基本要求,另外:
- 成员函数的名称,参数列表相同时,non-const成员函数与const成员函数可以构成重载;
- 成员函数的名称,参数列表不同时,non-const成员函数与const成员函数可以构成重载;
- 成员函数的名称,参数列表相同时,non-static成员函数与static成员函数不能构成重载;
- 成员函数的名称,参数列表不同时,non-static成员函数与static成员函数可以构成重载
例如:
class Test
{
public:
void Fun();
void Fun() const;
static void Fun(int n);
};
void Test::Fun()
{
cout << "Test::Fun() ..." << endl;
}
void Test::Fun() const
{
cout << "Test::Fun() const ..." << endl;
}
/*
void Test::Fun()
{
cout << "static Fun() ..." << endl;
}
*/
void Test::Fun(int n)
{
cout << "static Fun(int n) ..." << endl;
}
注意:const成员函数在类中声明时带const关键字,在类外定义时也要加const关键字;static成员函数在类中声明时带const关键字,在类外定义时则不需要加static关键字。
2.override(覆盖)
override和overwrite都是发生在基类与派生类函数之间,override需要满足以下几个要求:
- 不同的作用域,基类与派生类
- 虚函数,基类的成员函数带virtual关键字
- 基类成员函数与派生类成员函数名称相同,参数列表也相同
例如:
class Base
{
public:
virtual void Fun();
};
void Base::Fun()
{
cout << "Base::Fun ..." << endl;
}
class Derived :public Base
{
public:
void Fun();
};
void Derived::Fun()
{
cout << "Derived::Fun ..." << endl;
}
int main()
{
Base* pb = new Base;
Derived d;
pb = &d;//基类指针指向派生类对象
pb->Fun(); //调用派生类的函数实现多态
pb->Base::Fun();
return 0;
}
在这个例子中要注意的是,基类的virtual void Fun();与派生类的void Fun();形成多态,所以可以通过基类指针访问派生类的函数
3.overwrite(重写)
overwrite需要满足以下几个要求:
- 不同的作用域,基类与派生类
- 基类成员函数不带virtual关键字,基类成员函数与派生类成员函数名称相同,参数列表相同与不相同都可以
- 基类成员函数带virtual关键字,但基类成员函数与派生类成员函数名称相同,参数列表不相同
例如:基类成员函数带virtual关键字,但基类成员函数与派生类成员函数名称相同,参数列表不相同时:
class Base
{
public:
virtual void Fun();
};
void Base::Fun()
{
cout << "Base::Fun ..." << endl;
}
class Derived :public Base
{
public:
void Fun(int n);
};
void Derived::Fun(int n)
{
cout << "Derived::Fun ..." << endl;
}
int main()
{
Base* pb = new Base;
Derived d;
pb = &d;
pb->Fun();
//pb->Fun(2); Error,没有形成多态,不能调用派生类的函数
d.Fun(3);
//d.Fun(); //Error,基类中的Fun()被派生类重写,隐藏起来
d.Base::Fun();//通过作用域运算符调用基类函数
return 0;
}
在这个例子中要注意的是,基类的virtual void Fun();与派生类的void Fun(int n);没有形成多态,所以不能通过基类指针访问派生类的函数
再例如:基类成员函数不带virtual关键字,基类成员函数与派生类成员函数名称相同,参数列表相同与不相同时
class Base
{
public:
void Fun();
};
void Base::Fun()
{
cout << "Base::Fun ..." << endl;
}
class Derived :public Base
{
public:
void Fun(int n);
};
void Derived::Fun(int n)
{
cout << "Derived::Fun ..." << endl;
}
int main()
{
Derived d;
d.Fun(3);
//d.Fun(); //Error,基类中的Fun()被派生类重写,隐藏起来
d.Base::Fun();
return 0;
}
class Base
{
public:
void Fun();
};
void Base::Fun()
{
cout << "Base::Fun ..." << endl;
}
class Derived :public Base
{
public:
void Fun();
};
void Derived::Fun()
{
cout << "Derived::Fun ..." << endl;
}
int main()
{
Derived d;
d.Fun();//调用派生类的函数,基类函数被重写隐藏
d.Base::Fun();
return 0;
}
通过对overwrite的3个例子实现,发现overwrite会将基类的函数隐藏起来,派生类对这个函数进行重写,通过派生类对象不能直接调用该函数;基类指针指向派生类对象时,只能调用基类的函数,不能调用派生类函数
c++中的overload、overwrite、override的更多相关文章
- 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别
一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...
- 公有/私有/保护继承、overload/overwrite/override之间的区别
一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...
- C++中的Overload、Override和Overwrite
在C++语言中有一组基础的概念一直都容易混淆:Overload.Override和Overwrite分别表示什么意思?下面把这三个概念整理一下: 1. Overload(重载) 重载的概念最好理解,在 ...
- Java中的Overload和Override有什么区别
Overload和Override的区别 1.Overload 定义 Overload是重载的意思.它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后在调用时,虚拟机就会 ...
- java中的Overload和Override
Overload为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法 然后再调用时,就会根据不同的参数样式,来选择合适的方法执行 在使用重载时只能通过不同的参数样式. 例 ...
- C++中overload 、override、overwrite 之间的区别
Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载.(1)相同的范围(在同一个类中):(2)函数名字相同:( ...
- Overload和Override的区别 C++ Java
Overload:顾名思义,就是Over(重新)——load(加载),所以中文名称是重载. 它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名.返回值.类型不能相同: 或者说可以改变参数 ...
- overload和override二者之间的区别
overload和override三者之间的区别 Overload是重载,是有相同的方法名,但参数类型或个数彼此不同Override是重写,是在子类与父类中,子类中的方法的方法名,参数个数.类型都与父 ...
- overload和override的区别(转)
overload和override的区别 override(重写) 1.方法名.参数.返回值相同.2.子类方法不能缩小父类方法的访问权限.3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出 ...
- 【转】overload与override的区别
[转]overload与override的区别 override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子 ...
随机推荐
- [数据清洗]-使用 Pandas 清洗“脏”数据
概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...
- thinkinginjava学习笔记08_接口
抽象类和抽象方法 抽象方法是指没有具体实现的方法,仅仅有方法的声明和没有方法体:使用abstract关键字定义一个抽象方法:包含抽象方法的类成为抽象类,如果一个类中包含抽象方法则必须使用abstrac ...
- jQuery的get()post()getJson()方法
jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...
- Linux上安装Redis
很多编程的小朋友一提到Linux脑袋就大了,我也一样,我是一个大专的学生,没有学过Linux,感觉自己欠缺很多,也知道了人和人之间的差距,当你真正的走上社会,才知道社会是什么,才知道没有学历找工作有多 ...
- CRUL学习记录
在学习web相关知识的时候,了解到crul可以对网址进行请求,并可以看到网站的响应. 1.curl获取web网站返回的网页内容 命令:curl http://XXXXX 2.curl查看web网站的s ...
- 用mint ui去实现滚动选择日期并可以关闭拾取器
转发要备注出处哈,么么哒 注释的那些部分都是我在尝试的时候写得,留给自己看得,删除不影响效果哈,希望对你们有帮助,比较忙可能写得很粗糙,不好意思,有空再改了 实例一: <template&g ...
- Nodejs(pkg方式安装)卸载 及命令行模式的重新安装
直接在terminal下运行以卸载node和nvm: sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,shar ...
- MySQL innodb_flush_method
innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O ...
- 由浅入深SCF无服务器云函数实践
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...
- JavaScript练习2
今天做了一些JS数组的练习题 一.往数组中插入一个数字 var attr = [1,2,3,4,5,6]; var c = 7; for(var i=0;i<attr.length;i++) { ...