zoukankan      html  css  js  c++  java
  • C++ 派生类覆盖重载基类函数

    派生类希望基类重载函数可见,情况有三种:

        a)派生类中覆盖某个版本,则某个版本可见,全部都覆盖重写,则全部版本可见。

        b)派生类中一个也不覆盖,则全部基类版本可见。

        c)派生类需要添加新的重载版本,同时又需要可见基类的重载版本,此时并不是必须全部覆盖重写全部版本。可在派生类中用using声明基类重载的函数。

          说明:对派生类没有重新定义的重载版本的访问实际上是对using声明点的访问。

    两种注意点:

        a)指向派生类的基类指针或引用,不可调用派生类中的重载函数。

          原因:静态编译名字查找先于类型检查,在基类中找到同名函数,就不喊在派生类中继续找,而基类不存在目标调用形式的函数

        b)若不用using声明基类的重载版函数,派生类对象不可调用基类的重载版本。

          原因:派生类的函数,隐藏了基类的同名函数。

    h----------------------
    #ifndef DEMOCLASS_H
    #define DEMOCLASS_H
    
    #include <iostream>
    using namespace std;
    
    class DemoClass
    {
    public:
        DemoClass();
        void func(int);
        void func(char);
    };
    
    class DerivedClass:public DemoClass
    {
     public:
         using DemoClass::func;
         void func(string);
    };
    
    
    #endif // DEMOCLASS_H
    
    
    cpp---------------------------
    #include "democlass.h"
    
    DemoClass::DemoClass()
    {
        cout<<"construct..."<<endl;
    }
    
    void DemoClass::func(int)
    {
        cout<<"DemoClass func(int)..."<<endl;
    }
    
    void DemoClass::func(char)
    {
        cout<<"DemoClass func(char)..."<<endl;
    }
    
    void DerivedClass::func(string)
    {
        cout<<"DerivedClass func(string)..."<<endl;
    }
    
    
    main----------------------
    #include <QCoreApplication>
    #include "democlass.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        DemoClass *demo;
        DerivedClass derived;
        demo = &derived;
    
        cout<<"...Demo object that point to Derived access func..."<<endl;
        demo->func(1);
        demo->func('a');
    
        cout<<endl<<"...derived object access func..."<<endl;
        derived.func(1);
        derived.func('a');
        derived.func("abc");
        return a.exec();
    }
    
    
    
    运行结果--------------------
    construct...
    ...Demo object that point to Derived access func...
    DemoClass func(int)...
    DemoClass func(char)...
    
    ...derived object access func...
    DemoClass func(int)...
    DemoClass func(char)...
    DerivedClass func(string)...
  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/azbane/p/11073125.html
Copyright © 2011-2022 走看看