类成员函数的重载 继承 隐藏

简介:

重载

  1. 相同的范围(在同一个类中)
  2. 函数名相同
  3. 参数不同
  4. virtual关键字可有可无

重载与继承、隐藏很好区分,因为重载函数在同一个类中

举例说明

复制代码
#include <iostream>
using namespace std;
class Base
{
    public:
        void f(int x) {cout << "Base f(int)" << x << endl;}
        void f(float x) {cout << "Base f(float)" << x << endl;}
};

int main()
{
    Base b;
    b.f(42);
    b.f(3.14f);
}
复制代码

结果

 

继承

  1. 不同的范围(分别位于基类和派生类)
  2. 函数名相同
  3. 参数相同
  4. 基类必须有virtual关键字

隐藏

  • 如果派生类的函数与基类的函数同名、同参数,基类函数不带有virtual关键字
  • 如果派生类函数与基类的函数同名、不同惨,不管基类函数带不带virtual关键字

归纳起来

   同名前提(不同名免谈)

  • 同参+virtual——继承
  • 同参+无virtual  / 不同参 —— 隐藏

强调:只要不是继承(virtural+同参)就是隐藏,隐藏后,如果基类、派生类有相同函数名,派生类对象只能调用派生类的函数。

  View Code
  View Code

 

举例说明

复制代码
#include <iostream>
using namespace std;
class Base
{
    public:
        virtual void f(float x) {cout << "Base f" << x << endl;}
        void g(float x) {cout << "Base g" << x << endl;}
        void h(float x) {cout << "Base h" << x << endl;}
};

class Derived : public Base
{
    public:
        void f(float x) {cout << "Derived f" << x << endl;}  //同参 + virtual —— 继承
        void g(int x) {cout << "Derived g" << x << endl;}    //不同惨 ——隐藏
        void h(float x) {cout << "Derived h" << x << endl;}  //同参 + 无virtual ——隐藏
};

int main()
{
    Derived d;
    Base *pb = &d;
    Derived *pd = &d;
    
    pb->f(3.14f);
    pd->f(3.14f);

    pb->g(3.14f);
    pd->g(3.14f);
    
    pb->h(3.14f);
    pd->h(3.14f);
}
复制代码

结果
 

 

举例说明虚函数、隐藏的区别

复制代码
#include <iostream>
#include <string>
using namespace std;

class base
{
    public:
        virtual void test() { cout << "test base" << endl; }
        void test_1() { cout << "test_1 base" << endl; }
};

class derived : public base
{
    public:
        void test() { cout << "test derived" << endl; }       //虚函数
        void test_1() { cout << "test_1 derived" << endl; }   //隐藏
};

int main()
{
    derived d1, d2;
    base *p1 = &d1;
    base *p2 = &d2;
    p1->test();
    p2->test_1();
}                                
复制代码

结果

分析

      动态绑定必须通过基类的引用指针调用虚函数(virtual)。当这样做时,编译器将在基类中查找virtual函数。

假如找到了(同名、同参):就在其派生类中找对应的函数(这就是为什么必须在基类和派生类中特点是:同名、同参)。

  • 如果找到了就调用派生类的函数
  • 否则乖乖的用基类的虚函数

假如没找到对应的virtual,就找对应的函数(同名同参),这回只能在父类中倒腾了,因为根本没法通过virtual穿越到子类。

 

      隐藏就不同了,如果基类中连函数原型都没有,就直接报错了。如果有:直接调用就得啦(没有virtural没法对应派生类的重定义的函数)。

 

 



本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3248609.html,如需转载请自行联系原作者

相关文章
力扣面试经典题之二叉树
力扣面试经典题之二叉树
109 0
|
4天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
7天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
406 93
|
6天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
401 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
|
6天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
292 158