• c++ 覆盖、重载、隐藏


    函数重载:

    1、相同的范围内(即同一类中)

    2、函数名相同;

    3、参数不同;

    4、virtual关键字可有可无;

    函数覆盖:虚函数的功能、动态多态

    (父类中必须有virtual)========派生类函数 覆盖掉 基类函数;

    指派生类中存在重新定义的函数,其函数名、参数、返回值类型必须同父类中相对应被覆盖的函数严格一致。覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同。

    当派生类对象调用子类该同名函数会自动调用子类中的函数,而不是父类中的版本,这个机制就叫做覆盖;

    1、不同的范围内(分别在 基类 和 派生类中)

    2、函数名相同;

    3、参数相同;

    4、virtual关键字必须有;

    隐藏:

    隐藏是指派生类的函数屏蔽了与其同名的基类函数;

    A、派生类的函数与基类的函数同名,但是参数不同。不论有无virtual,基类的函数将被隐藏;=======<区别: 重载>

    B、派生类的函数与基类的函数同名,参数相同,必须没有virtual,基类的函数被隐藏;=========<区别:覆盖>

     1 #include <iostream.h>  
     2 class Base  
     3 {  
     4 public:  
     5     virtual void f(float x){ cout << "Base::f(float) " << x << endl; }  
     6             void g(float x){ cout << "Base::g(float) " << x << endl; } 
     7             void h(float x){ cout << "Base::h(float) " << x << endl; }  
     8 };  
     9 class Derived : public Base 
    10 {  
    11 public:  
    12     virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }  
    13             void g(int x){ cout << "Derived::g(int) " << x << endl; } 
    14             void h(float x){ cout << "Derived::h(float) " << x << endl; } 
    15 };  

    Derived::f(float x)覆盖Base::f(float x)  //不同范围,参数相同,函数名相同,有关键字virtual ----------覆盖

    Derived::g(int  x)隐藏Base::g(float x)  //不同范围,参数不同,函数名相同,无关键字virtual----------隐藏

    Derived::h(float x)隐藏Base::h(float x)  //不同范围,参数相同,函数名相同,但是无virtual-----------隐藏

     1 void main(void)  
     2 {  
     3 Derived  d;  
     4 Base *pb = &d;  
     5 Derived *pd = &d; 
     6  
     7 // Good : behavior depends solely on type of the object  
     8 pb->f(3.14f); // Derived::f(float) 3.14  
     9 pd->f(3.14f); // Derived::f(float) 3.14  
    10 
    11 // Bad : behavior depends on type of the pointer  
    12 pb->g(3.14f); // Base::g(float) 3.14  
    13 pd->g(3.14f); // Derived::g(int) 3        (surprise!)  
    14 
    15 // Bad : behavior depends on type of the pointer  
    16 pb->h(3.14f); // Base::h(float) 3.14      (surprise!)  
    17 pd->h(3.14f); // Derived::h(float) 3.14  
    18 } 

      在第一种调用中,函数的行为取决于指针所指向的对象。

      在第二、三种调用中,函数的行为取决于指针的类型。

    所以说,隐藏破坏了面向对象编程中多态这一特性,会使得OOP人员产生混乱。  

    不过隐藏也并不是一无是处,它可以帮助编程人员在编译时期找出一些错误的调用。但我觉得还是应该尽量避免使用隐藏这一些特性,该加virtual时就加吧。

  • 相关阅读:
    一周试用yii开发一个带各种该有功能的web程序(三)
    制作centos的U盘启动盘
    VMware下centos6.3minimal搭建网络环境
    [原]SQLite的学习系列之获取数据库版本
    Android Studio NDK 学习之接受Java传入的字符串
    [原]Ubuntu 14.04编译Android Kernel
    [原]运行编译好的Android模拟器
    [原]编译Android源码过程中遇到的问题
    [原]Android打包之Gradle打包
    [原]Android打包之跨平台打包
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3739171.html
Copyright © 2020-2023  润新知