• 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)...
  • 相关阅读:
    nodeJS中的包
    NPM
    代码检查工具jshint和csslint
    javascript中Date对象的应用
    Collection包结构,与Collections的区别
    TreeMap、HashMap、LindedHashMap的区别
    HashMap和ConcurrentHashMap的区别,HashMap的底层源码
    HashMap和HashTable的区别
    Map、Set、List、Queue、Stack的特点与用法
    String、StringBuffer与StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/azbane/p/11073125.html
Copyright © 2020-2023  润新知