c++ Overload、 Override 和 Overwrite



    • Overload 重载
      • 同名不同参,注意参数有无const也视为不同
      • 仅返回值不同,不构成重载
      • 构成重载的各个函数具有相同的作用域。处于同一文件/全局域/namespace 内的同名不同参函数;对类成员函数,则发生在同一类域中。(基类和派生类之间不构成重载)
    • Override 覆盖
      • 不同作用域:分别位于基类和派生类
      • 基类函数必须为vitrual函数,而派生类函数和基类虚函数同名同参
    • Overwrite 隐藏
      • 派生类和基类函数同名不同参,不论基类函数是否是vitrual,派生类函数被隐藏
      • 派生类和基类非vitrual函数同名同参,基类函数被隐藏
    • 三者之间区分
      • overload是同一个类中的成员函数间的水平关系;而override/overwrite都是派生类和基类间的垂直关系
      • override覆盖的前提或特点是基类函数必须为virtual
      • override覆盖的结果是根据对象类型决定调用哪个函数(多态);而Overwrite隐藏则表现为根据指针类型决定调用哪个函数,这是覆盖和隐藏最直观的区别。
    #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;
    


  • 我们的项目是不是没有用到过overwrite,不太了解



  • @sp 用到过



  • @ruisongzhou 哪个文件里面?


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待