C++中Overload、Overwrite及Override的区别

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

TAG: Overload Overwrite Override

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

Override( 覆盖 ) :是指派生类函数覆盖基类函数,特征是: ( 1 )不同的范围(分别位于派生类与基类); ( 2 )函数名字相同; ( 3 )参数相同; ( 4 )基类函数必须有 virtual 关键字。

Overwrite( 重写 ) :是指派生类的函数屏蔽了与其同名的基类函数,规则如下: ( 1 )如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。 ( 2 )如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

#include <stdio.h>
#include <iostream>
class Parent
{
public:
    void F()
    {
        printf("Parent.F()/n");
    }
    virtual void G()
    {
        printf("Parent.G()/n");
    }
    int Add(int x, int y)
    {
        return x + y;
    }
    //重载(overload)Add函数
    float Add(float x, float y)
    {
        return x + y;
    }
};
 
class ChildOne:Parent
{
    //重写(overwrite)父类函数
    void F()
    {
        printf("ChildOne.F()/n"); 
    }
    //覆写(override)父类虚函数,主要实现多态
    void G()
    {
        printf("ChildOne.G()/n");
    }
};
 
 
int main()
{
    ChildOne childOne;// = new ChildOne();
    Parent* p = (Parent*)&childOne;
    //调用Parent.F()
    p->F();
    //实现多态
    p->G();
    Parent* p2 = new Parent();
    //重载(overload)
    printf("%d/n",p2->Add(1, 2));
    printf("%f/n",p2->Add(3.4f, 4.5f));
    delete p2;
    system("PAUSE");
    return 0;
}

时间: 2024-10-27 04:41:02

C++中Overload、Overwrite及Override的区别的相关文章

重载(overload)、覆盖(override)、隐藏(hide)介绍与区别

 这三个概念都是与OO中的多态有关系的.如果单是区别重载与覆盖这两个概念是比较容易的,但是隐藏这一概念却使问题变得有点复杂了,下面说说它们的区别吧.        重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同.调用的时候根据函数的参数来区别不同的函数.        覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现.即函数名和参数都一样,只是函数的实现体不一样.        隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了.隐藏与另外两个概念表

重载(overload)、覆盖(override)、隐藏(hide)的区别

这三个概念都是与OO中的多态有关系的.如果单是区别重载与覆盖这两个概念是比较容易的,但是隐藏这一概念却使问题变得有点复杂了,下面说说它们的区别吧.        重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同.调用的时候根据函数的参数来区别不同的函数.        覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现.即函数名和参数都一样,只是函数的实现体不一样.        隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了.隐藏与另外两个概念表面

Laravel模板引擎Blade中section的一些标签的区别介绍

 这篇文章主要介绍了Laravel模板引擎Blade中section的一些标签的区别介绍,本文讲解了@yield 与 @section.@show 与 @stop.@append 和 @override的区别,需要的朋友可以参考下     Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚.比如,使用中可能会遇到这样的问题: 1.@yield 和 @section 都可以预定义可替代的区块,这两者有什

Android中home键和back键区别实例分析_Android

本文实例分析了Android中home键和back键区别.分享给大家供大家参考.具体如下: back键 Android的程序无需刻意的去退出,当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Destroy()方法来销毁当前Activity,当此Activity又被其它Activity启动起来的时候,会重新调用OnCreate()方法进行创建,当栈中所有Activity都弹出结束后,应用也就随之结束了.如果说程序中存在service之类的,则可以在恰当的位置监听处理

MyBatis中关于resultType和resultMap的区别介绍_java

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值.

【求助】new与override的区别

问题描述 /*2008年5月20日16:52:48new与override的区别*/usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespace__20_3{classProgram{classA{publicvirtualvoidf(){Console.WriteLine("AAAA");}}classB:A{newpublicvoidf()//请问这里new要是改为override有何区别?是不是只有o

PHP中date与gmdate有什么区别?

  一.PHP中date与gmdate有什么区别? PHP中的时间有2个格式化函数:date()和gmdate(),在官方的文档中的描述为: date - 格式化一个本地时间/日期 gmdate - 格式化一个 GMT/UTC 日期/时间,返回的是格林威治标准时(GMT). 举个例子,我们现在所在的时区是+8,那么服务器运行以下脚本返回的时间应该是这样的: 当前时间假定是2007-03-14 12:15:27 echo date('Y-m-d H:i:s', time()); 输出为:2007-

SQL中UNION 与 UNION ALL 的区别

区别 SQLServer2000中UNION与UNION ALL的区别 UNION 运算符: 将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行.这与使用联接组合两个表中的列不同. 使用 UNION 组合两个查询的结果集的两个基本规则是: 所有查询中的列数和列的顺序必须相同. 数据类型必须兼容.        这种多结果的查询组合为单一结果集在实际中应用的非常方便.但在应用中也有有着问题,如下实例可以进一步说明问题. 问题描述:        为了进一步分析与统计企

C#中的virtual、override

C# 是面向对象的程序设计语言,每一个函数都属于一个类. 当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方 法的实现.也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在 ,它们都会存在.就像入口函数Static void Main,因为它是静态函数,所以可以直接被调 用. 当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable = new ClassName();声明一个类的实例之前,它都不存在