作为初学者,本文只从语法和简单的使用角度对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的更多相关文章

  1. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  2. 公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  3. C++中的Overload、Override和Overwrite

    在C++语言中有一组基础的概念一直都容易混淆:Overload.Override和Overwrite分别表示什么意思?下面把这三个概念整理一下: 1. Overload(重载) 重载的概念最好理解,在 ...

  4. Java中的Overload和Override有什么区别

    Overload和Override的区别 1.Overload 定义 Overload是重载的意思.它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后在调用时,虚拟机就会 ...

  5. java中的Overload和Override

    Overload为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法 然后再调用时,就会根据不同的参数样式,来选择合适的方法执行 在使用重载时只能通过不同的参数样式. 例 ...

  6. C++中overload 、override、overwrite 之间的区别

    Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载.(1)相同的范围(在同一个类中):(2)函数名字相同:( ...

  7. Overload和Override的区别 C++ Java

    Overload:顾名思义,就是Over(重新)——load(加载),所以中文名称是重载. 它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名.返回值.类型不能相同: 或者说可以改变参数 ...

  8. overload和override二者之间的区别

    overload和override三者之间的区别 Overload是重载,是有相同的方法名,但参数类型或个数彼此不同Override是重写,是在子类与父类中,子类中的方法的方法名,参数个数.类型都与父 ...

  9. overload和override的区别(转)

    overload和override的区别 override(重写) 1.方法名.参数.返回值相同.2.子类方法不能缩小父类方法的访问权限.3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出 ...

  10. 【转】overload与override的区别

    [转]overload与override的区别 override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子 ...

随机推荐

  1. AO之Addins开发[杂谈1] Toolbar中添加一条分割线

    在XML代码中,给Item添加separator属性,需要从哪里打分割线,就将其设置为true即可.如下图所示: 如紫色框住的灰色竖线所示. 默认separator属性是false的,这个小东西极其隐 ...

  2. CJOJ 免费航班

    Description 小Z在MOI比赛中获得了大奖,奖品是一张特殊的机 票.使用这张机票,可以在任意一个国家内的任意城市之间的免费飞行,只有跨国飞行时才会有额外的费用.小Z获得了一张地图,地图上有城 ...

  3. ES6 函数的扩展2

    8.2 rest参数 ES6引入rest参数(形式为"-变量名"),用于获取函数的多余参数,这样就不需要使用arguments对象了. arguments对象并没有数组的方法,re ...

  4. LAMP第一部分-环境搭建

    1. 安装mysqlcd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/mysql-5.1.40-linux-i686- ...

  5. JS 中 cookie 的使用

    1.cookie 是什么? ①.cookie 是存储于访问者计算机中的变量.每当一台计算机通过浏览器来访问某个页面时,那么就可以通过 JavaScript 来创建和读取 cookie. ②.实际上 c ...

  6. perl多线程使用

    原文来自:博客园(华夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun <<=========================threa ...

  7. opacity的背景透明&background中rgba的背景色透明

    近期使用css实现了一个loading旋转加载的图片效果,类似gif动画 过程中,需要透明背景,但是图片不要透明 只要背景透明!只要背景透明!只要背景透明! 这里对透明模糊了,两种写法,模糊了 A: ...

  8. 《algorithms Unlocked》读书笔记3——计数排序

    <Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础,算是啃CLRS前的开胃菜和辅助教材.如果CLRS的厚 ...

  9. Error: Can't find Python executable, you can set the PYTHON env variable.

    该错误解决方案. NodeJS安装Npm包时出现错误: npm WARN prefer global node-gyp@3.4.0 should be installed with -g > s ...

  10. Java学习笔记25(System类)

    System类,系统类,包含的是静态方法,无法创建对象 这里介绍几个简单的方法,其他一些在后边用到的时候会讲 类方法: currentTimeMillis():获取当前毫秒数 package demo ...