zoukankan      html  css  js  c++  java
  • 覆盖,重写,重载,隐藏,多态的区别

    简单解析一下OOP编程中常常让人困惑的几个名词。

    覆盖,重写,重载,隐藏,多态

    首先,覆盖也称重写,英文override

    特点:

    1.      指不同作用域中(派生类和基类)同名函数的定义

    2.      函数名、参数均完全相同

    3.      基类对应方法前有 virtual,即被声明为虚函数

     作用:

    基类指针和引用在调用对应方法时,根据所指对象类型实现动态绑定。

     其次,重载(overload)

    特点:

    1.      作用域,同一类中

    2.      函数名相同,但是参数类型、个数等不完全相同

    作用:

    同一方法,根据传递消息的不同(类型或个数),产生不同的动作(相同方法名,实现不同)。

     隐藏(遮蔽)

     特点:

    不同作用域,基类和派生之间

    分两种情形:

    一、             基类和派生类函数名相同,但是参数列表不同,不同有无virtual,基类函数在派生类中被隐藏,派生类只能调用新的方法,不能调用已被隐藏的基类方法(不同于重载,作用域不同)

    二、             基类与派生类同名,同参,但基类函数无virtual,同样派生类中同样隐藏基类的同名同参函数(不同于覆盖,无virtual)


    示例

    #include <iostream>
    using namespace std;
    
    class base
    {    
    public:
        virtual void f(float x) {cout<<"base:f"<<endl; }
        void g(float x) {cout<<"base:g"<<endl; }
        void h(float x) {cout<<"base:h"<<endl;}
    };
    
    class derived : public base
    {
    public:
        virtual void f(float x) {cout<<"derived:f"<<endl; }
        void g(int x) {cout<<"derived:g"<<endl; }
        void h(float x) {cout<<"derived:h"<<endl;}
    };
    
    int main()
    { 
    derived d;
    base *pb = &d;
    derived *pd = &d;
    
    cout<<"test override:
    ";
    pb->f(3.14);
    pd->f(3.14);
    
    cout<<"test hide 1:
    ";
    pb->g(3.14);
    pd->g(3.14);
    
    cout<<"test hide 2:
    ";
    pb->h(3.14);
    pd->h(3.14);
    
    return 0;
    }
    

    分析:覆盖进行动态绑定,根据基类指针或引用指向的对象类型,调用相应的方法

    隐藏进行静态绑定,取决于 调用的指针或应用类型,而非 基类指针或引用指向的对象类型

    使用时,隐藏以产生混淆,应极力避免。


    多态

    指OOP编程中的一种表现特性。相同消息,作用于同一方法(只是函数名相同),产生的结果不同。

    表现方法有  重载,实现接口与继承

    重载中表现为有一对象调用同一个函数名(如add),根据传递参数(消息)的不同(如分别为int或float类型),调用不同的方法实现产生不同的结果。

    继承中表现为不同层面中(派生类和基类),对同一函数(同名同参)的调用产生同的结果。


  • 相关阅读:
    ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
    初学Larevel 2014-08-21 11:24 90人阅读 评论(0) 收藏
    初学PHP&MySQL 2014-05-31 12:40 92人阅读 评论(0) 收藏
    codeforces 570 E. Pig and Palindromes (dp)
    codeforces 570 D. Tree Requests (dfs序)
    poj 2157 Maze (bfs)
    cf 570 C. Replacement (暴力)
    cf 570B B. Simple Game(构造)
    cf 570 A. Elections
    hdu 1429胜利大逃亡(续) (bfs+状态压缩)
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3299589.html
Copyright © 2011-2022 走看看