1 重写(覆盖)override

  override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。

重写需要注意:

  • 被重写的函数不能是static的,必须是virtual的
  • 重写函数必须有相同的类型,名称和参数列表
  • 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public、protect也是可以的

2 重载overload

  overload是重载,一般是在一个类实现若干重载的方法,这些方法的名称相同而参数形式不同。但是不能靠返回类型来判断。

重载需要注意:

  • 位于同一个类中
  • 函数的名字必须相同
  • 形参列表不同
  • 若一个重载版本的函数面前有virtual修饰,则表示他是虚函数,但他也是属于重载的一个版本
  • 不同的构造函数(无参构造、有参构造、拷贝构造)是重载的应用

3 重定义redefining

  派生类对基类的成员函数重新定义,即派生类定义了某个函数,该函数的名字与基类中函数名字一样。

  重定义也叫做隐藏,子类重定义父类中有相同名称的非虚函数(参数可以不同)。如果一个类,存在和父类相同的函数,那么这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用时不能成功的。

重定义需要注意:

  • 不在同一个作用域(分别位于基类、派生类)
  • 函数的名字必须相同
  • 对函数的返回值、形参列表无要求
  • 若派生类定义该函数与基类的成员函数完全一样(返回值、形参列表均相同),且基类的该函数为virtual,则属于派生类重写基类的虚函数
  • 若重新定义了基类中的一个重载函数,则在派生类中,基类中该名字函数(即其他所有重载版本)都会被自动隐藏,包括同名的虚函数

4 多态polymorphism

  多态的概念比较复杂,一种不严谨的说法是:继承是子类使用父类的方法,而多态是父类使用子类的方法。

  一般我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。

  多态分为两类:静态多态性和动态多态性,以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用哪个函数,因此静态多态性又称为编译时的多态性。静态多态性是通过函数的重载实现的。动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数实现的。

下面列举一个实例来说明他们:

class Base

{

private:
virtual void display() {cout<<"Base display()"<<endl;}

void say() {cout<<"Base say()"<<endl;}

public:
void exec() {display();say();}

void fun1(string a) {cout<<"Base fun1(string)"<<endl;]

void fun1(int a) {cout<<"Base fun1(int)"<<endl;}//overload,两个fun1函数在Base类的内部被重载

};

class ChildA:public Base

{

public:

void display() {cout<<"ChildA display()"<<endl;}//override,基类中的display为虚函数,故此处为重写(覆盖)

void fun1(int a,int b) {cout<<"ChildA fun1(int,int)"<<endl;}//redefining,fun1函数在Base类中不为虚函数,故此处为重定义

void say() {cout<<"ChildA say()"<<endl;}//redefining

};

class ChildB:pubic Base

{

public:

void fun1(int a) {cout<<"ChildB fun1(int)"<<endl;}//redefining

};

int main()

{
ChildA a;

Base* b=&a;

b->exec(); //display():version of DeriveA call(polymorphism) //say():version of Base called(allways )

//b里边的函数display被A类重写(覆盖),say还是自己的

a.exec(); //same result as last statement   
a.say();
DeriveB c;
c.f1(1); //version of DeriveB called

}

执行结果:

ChildA display()

Base say()

ChildA display()

Base say()

ChildA say()

ChildB fun1(int)

总结:

重写(覆盖)

  • 是指派生类函数重写(覆盖)基类函数
  • 不同的范围,分别位于基类和派生类中
  • 函数的名字相同
  • 参数相同(违背本条件和下面一个条件,都是重定义)
  • 基类函数必须有virtual关键字

重载

  • 成员函数
  • 形同的范围(在同一个类中)
  • 函数的名字相同
  • virtual关键字可有可无

重定义(隐藏)

    • 派生类屏蔽了与其同名的基类函数
    • 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏
    • 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有visual关键字,此时,基类的函数被隐藏

C++重写(覆盖)、重载、重定义、多态的更多相关文章

  1. C++学习笔记 封装 继承 多态 重写 重载 重定义

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  2. c++ 重载,覆盖,重定义 2

    前一篇 http://www.cnblogs.com/iois/p/4085173.html 写有些地方不够准确,重新整理了一遍 函数重载(Function Overloading) C++允许同一范 ...

  3. c++中的函数重载、函数重写、函数重定义

    目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...

  4. c++ 重载,覆盖,重定义

    写的不是很明白,后来又重新整理过了,在: http://www.cnblogs.com/iois/p/4986790.html 函数重载(Function Overloading) C++允许同一范围 ...

  5. C++ 重载(overload)、重写(overrride)、重定义(redefine)总结

    引自:http://www.189works.com/article-42111-1.html 先来看几个概念: 重载(overload),重写(override,也称覆盖), 重定义(redefin ...

  6. 重载重写重定义-易混淆概念-C++编译器处理方式

    1.函数重载 1)必须在同一个类中进行. 2)子类无法重载父类的函数,父类同名函数将被名称覆盖 3)重载是在编译期间根据参数类型和个数决定函数调用 2.函数重写 1)必须发生于父类与子类之间 2)并且 ...

  7. 重载(overload)、重写:覆盖(override)、重定义:遮蔽(redefine)、多态

    同一域名空间,函数名相同,签名不同 编译期绑定确定绑定函数,也称为静态多态 重写:覆盖(override) 虚函数 子类空间,函数名相同,签名相同 重定义:遮蔽(redefine) 非虚函数,子类成员 ...

  8. 【C++】三大概念要分清--重载,隐藏(重定义,覆盖(重写)

    { c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)} 重载 •  概念:在同一个作用域内:函数名相同,参数列表不同(参数个数不同,或者参数类型不同,或者参数个数和参数类型都不同),返回值类 ...

  9. c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)

    重载,隐藏(重定义),覆盖(重写)—这几个名词看着好像很像,不过其实一样都不一样!! 综述: 说明:覆盖中的访问修饰符可以不同是指可以不用显示地用virtual:当访问修饰符改为const或者stat ...

随机推荐

  1. Go 方法使用

    方法的定义 在 Go 语言里,方法和函数只差了一个,那就是方法在 func 和标识符之间多了一个参数. type user struct { name string, email string, } ...

  2. perl语言的线程使用

    参考的教程链接是 https://www.cnblogs.com/migrantworkers/p/6973459.html 1.Perl 多线程的使用,join 和 detach 的区别 ,join ...

  3. wince窗口被静态的焦点挡住

    效果如下图: 问题:文本框被挡住了 解决办法如下: 找到该窗体,设置属性Menu值为无即可解决

  4. fcrackzip破解zip密码

    kail系统里有fcrackzip工具,可以对设置密码的压缩包zip直接进行破解,不用字典,直接进行暴力破解. fcrackzip 所用到的参数介绍如下:-b 表示暴力破解-c 表示暴力破解中使用的字 ...

  5. X宝个人支付到账

    扫码登录,能看懂的我就不多说了,封了我多少篇文章了!!!!X宝个人到账通知.

  6. 不常见的sql错误处理方法(1)

    select @@global.sql_mode, mysql5.7 导致 group查询出错 set @@global.sql_mode='' # mysql重启就失效了: phpstudy -&g ...

  7. Oracle 多租户环境学习路线图

    Category Topic Documentation Concepts Overview of CDBs and PDBs "Overview of the Multitenant Ar ...

  8. Proxy ARP

    翻译自:https://ccieblog.co.uk/arp/proxy-arp Proxy ARP在一些路由器上是默认开启的.其思想是使两个不同子网上的主机,在没有配置默认网关的情况下,实现彼此通信 ...

  9. fwrite、write、fread、read

    1. write和read 1.1 write: 头文件:#include<unistd.h> 原型: ssize_t write(int fd,const void*buf,size_t ...

  10. C++ ---释放内存(new和delete)

    C++ ---释放内存(new和delete) C++动态分配和释放内存 @c.biancheng.net/view/206.html -------------------------------- ...