返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一文详解C++子类函数为什么不能重载父类函数
  • 244
分享到

一文详解C++子类函数为什么不能重载父类函数

2024-04-02 19:04:59 244人浏览 薄情痞子
摘要

先说结论: 子类成员函数的函数名和基类一样,但是函数声明与基类不一样的时候,不会和基类函数构成重载,而是会隐藏基类函数 简要回顾下C++中的基本概念: 重写(override): 基

先说结论:

子类成员函数的函数名和基类一样,但是函数声明与基类不一样的时候,不会和基类函数构成重载,而是会隐藏基类函数

简要回顾下C++中的基本概念:

  • 重写(override): 基类函数带virtual,子类函数声明和基类完全一样,实现不一样
  • 载(overload): 同一个类中,函数名一样,函数参数类型,个数,顺序等不一样的构成重载
  • 隐藏(hide): 子类函数名和基类一样,但是函数声明与基类不一样,就会对基类的函数进行隐藏

那么,子类函数名和基类一样,但是函数声明与基类不一样的时候,为什么不能重载基类函数呢?
先看

例子一

#include <stdio.h>

class Base {
public:
    virtual void foo(float a) {
        printf(" Base :: foo(float) \n");
    };

    virtual void foo(double a) {
        printf(" Base :: foo(double) \n");
    };
};

class Derived : public Base {
public:
    virtual void foo(double a) {
        printf(" Derived :: foo(double) \n");
    };

};

int main() {
    Derived d;
    float a = 3.0f;
    d.foo(a);

    Base b;
    b.foo(a);
}

如果重载可以发生在子类和基类之间,函数调用d.foo(a)的最佳匹配应该是Base::foo(float a),而实际输出是

Derived :: foo(double)

说明float类型的a向上转型为double,调用了子类的函数,重载没有在子类和基类间发生。这里如果类型转换不能发生,将不能通过编译。

而b.foo(a)的输出为:

Base :: foo(float) 

这说明重载在单个类内部进行。

如果实在想在子类中调用父类的函数,对于下面的例子二(不能编译通过):

class A
{
public:
  void a() {}
};

class B : public A
{
public:
  void a(int) {}
};

int main()
{
  B b;
  b.a();
}

如果需要上面的函数可以编译通过,我们可以这样做:

  • 在class B 内部加上using A::a
  • 调用时使用b.A::a(),不推荐这样做

当然,问题的关键是为什么c++的设计者这么设计,从技术实现来说,访问基类函数来进行名字查找,实现跨类重载没有太大的难度。但是从实际用户意图来说,像上面B中添加void a(int)函数的目的就是为了重新实现A的接口,并隐藏原来的接口;当然,如果用户不想隐藏,可以加上using A::a。
另外,对于例子一,如果实现了跨类重载,那么d.foo(a)将也会调用到基类的函数,尽管float可以转型到float, 将很容易引起混淆

顺应用户意图和避免不必要的混淆,这可能就是C++设计者这么设计的原因。

到此这篇关于一文详解C++子类函数为什么不能重载父类函数的文章就介绍到这了,更多相关C++子类函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文详解C++子类函数为什么不能重载父类函数

本文链接: https://lsjlt.com/news/167241.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文详解C++子类函数为什么不能重载父类函数
    先说结论: 子类成员函数的函数名和基类一样,但是函数声明与基类不一样的时候,不会和基类函数构成重载,而是会隐藏基类函数 简要回顾下C++中的基本概念: 重写(override): 基...
    99+
    2024-04-02
  • 详解C++函数类型与重载函数
    目录1.首先对重载函数,明确函数的返回类型不能决定重载函数的类别,即2.注意形参列表中的默认值,使用含默认参数的重载函数时可能会产生二义性。例:问题:总结 1.首先对重载函数,明确函...
    99+
    2024-04-02
  • C++ 函数重写详解:覆盖父类函数的奥妙
    c++++ 的函数重写允许子类覆盖父类的函数,提供自己的特定实现。子类需要声明一个与父类同名、同参数类型的函数,并使用 override 关键字标记。重写函数可以用于扩展父类功能、为子类...
    99+
    2024-05-04
    c++ 函数重写
  • 覆盖父类函数:理解子类对父类行为的扩展
    面向对象编程中,子类通过覆盖父类函数扩展其行为。覆盖函数需使用 override 关键字,子类函数签名必须与父类完全相同。优点包括:定制父类行为、保持父类功能、提升代码可重用性。注意匹配...
    99+
    2024-05-01
    面向对象 重写
  • c++中什么函数不能重载
    在 c++ 中,以下类型的函数不能重载:1. 构造函数和析构函数;2. 友元函数;3. 运算符函数;4. 强制类型转换函数。原因是这些函数具有特殊的语义和语法规则,重载可能会导致歧义和错...
    99+
    2024-04-22
    c++
  • 函数重写原理揭秘:子类如何掌控父类行为
    问题:函数重写原理是什么?答案:函数重写允许子类通过声明一个同名方法并使用 override 关键字,重新定义从父类继承的方法,从而控制父类行为。步骤:在子类的构造函数中声明虚拟方法,使...
    99+
    2024-05-04
    函数重写 子类继承
  • 怎么使用C++函数类型与重载函数
    本篇内容介绍了“怎么使用C++函数类型与重载函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.首先对重载函数,明确函数的返回类型不能决定...
    99+
    2023-06-25
  • C++ 函数重写的场合:子类需求与父类接口的契合
    函数重写是指子类创建与其父类同名的不同实现的函数,通常用于以下场合:子类拥有父类未覆盖的特定需求。子类需要修改父类函数的行为。接口隔离原则要求将父类接口分解为更小的子接口。 C++ 函...
    99+
    2024-05-02
    c++ 函数重写
  • C++ 函数重载中如何处理不同参数类型的函数?
    c++++ 函数重载允许同名函数参数不同:参数列表不同(类型、数量、顺序)返回类型可相同或不同处理不同参数类型函数时,编译器使用参数推导和类型转换判定要调用的重载函数。 在 C++ 中...
    99+
    2024-04-14
    c++ 函数重载 隐式转换
  • python为什么不支持函数重载
    python中不支持函数重载的原因函数重载主要是为了解决可变参数类型和可变参数个数两个问题。而python中可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数,从而...
    99+
    2024-04-02
  • C++函数重载的细节图文详解
    前言:如果不想看论证,可以直接点击总结,跳转到最后 1、使用重载函数时,如果数据类型不匹配,C++尝试使用类型转换与形参进行匹配,如果转换后有多个函数能匹配上,编译器将报错; 论证如...
    99+
    2022-12-10
    c++函数重载例子 C++函数重载是什么 重载函数怎么写
  • 为什么需要使用 C++ 函数重载?
    c++++ 函数重载允许在同一个命名空间中创建多个具有相同名称但参数不同的函数,提供编写特定函数实现的灵活性,从而提高代码可读性、代码复用性、错误处理能力和性能。 为什么使用 C++ ...
    99+
    2024-04-26
    c++ 函数重载 代码可读性
  • 为什么 Go 函数不能返回带有约束类型参数的类型?
    为什么Go函数不能返回带有约束类型参数的类型?这是一个经常引发疑惑的问题。在Go语言中,函数的返回类型不能是带有约束类型参数的类型,这主要是由于Go语言对泛型的支持较为有限所导致的。在...
    99+
    2024-02-09
    go语言
  • c++类函数作为模板参数实现方式详解
    目录需求背景实现方式struct + operatorPass Function Signature需求背景 DB操作有四种基本操作:Insert、Update、Delete和Que...
    99+
    2023-03-01
    c++ 类函数作为模板参数 c++ 类函数
  • C++ 函数重写实战:实现子类专属功能的妙招
    函数重写允许子类重新定义基类的同名函数,实现特定于子类的功能:基于名称查找和类型匹配,当子类定义同名函数时,会重写基类函数。这允许子类提供不同的实现,例如示例中 circle 和 rec...
    99+
    2024-05-01
    c++ 函数重写 作用域
  • 函数重写与抽象方法:理解子类实现父类抽象方法的必要性
    函数重写允许子类重新定义父类方法,而抽象方法强制子类实现父类的未实现方法。子类实现父类抽象方法至关重要,因为它:提高代码的灵活性和可扩展性;减少代码冗余并促进重用;增强可测试性,允许轻松...
    99+
    2024-05-03
    抽象方法 函数重写 python
  • react-native 父函数组件调用类子组件的方法(实例详解)
    react-native 父函数组件调用类子组件的方法,代码如下所示: import React, {Component} from 'react'; import {Text, V...
    99+
    2024-04-02
  • c++中void函数不能赋值为什么
    c++kquote>在c++中,void函数不能赋值,原因如下:类型不匹配:void函数没有返回值,类型为void,与赋值运算符操作数类型不兼容。函数指针的本质:void函数没有返...
    99+
    2024-05-09
    c++
  • c++类函数作为模板参数实现的方法是什么
    今天小编给大家分享一下c++类函数作为模板参数实现的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。需求背景DB操作...
    99+
    2023-07-05
  • CString类里ReverseFind()函数为什么只能查找字符串
    CString类的ReverseFind()函数可以查找字符串中最后一个与给定字符或字符串相匹配的位置。它只能查找字符串,而不是单个...
    99+
    2023-10-27
    Cstring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作