• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我是张洪铭我是熊博士
时光静好,与君同;细水长流,与君语
博客园    首页    新随笔    联系   管理    订阅  订阅

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)...

 

posted @ 2019-06-23 16:03  我是张洪铭我是熊博士  阅读(3035)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3