首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

找不到基类中具有相同名称但签名不同的非虚函数

是指在派生类中无法找到与基类中具有相同函数名但参数列表不同的非虚函数。

在面向对象编程中,派生类可以继承基类的成员函数,包括非虚函数。但是,派生类中的函数必须与基类中的函数具有相同的函数名和参数列表,这被称为函数重载。如果派生类中找不到与基类中具有相同函数名但参数列表不同的非虚函数,可能有以下几种情况:

  1. 函数名或参数列表拼写错误:检查派生类中的函数名和参数列表是否与基类中的函数完全匹配,包括大小写和拼写。
  2. 函数被隐藏:如果派生类中定义了与基类中同名但参数列表不同的函数,派生类的函数会隐藏基类的函数。可以使用作用域解析运算符(::)来访问基类中被隐藏的函数。
  3. 函数签名不同:C++中,函数的签名由函数名和参数列表组成。如果派生类中定义的函数与基类中的函数具有不同的参数类型、参数个数或参数顺序,那么派生类中的函数将无法覆盖基类中的函数。

解决这个问题的方法是在派生类中重新定义一个与基类中的函数具有相同函数名和参数列表的函数,或者使用函数重载的方式定义一个新的函数。这样就可以在派生类中实现与基类中具有相同函数名但参数列表不同的非虚函数。

腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless):https://cloud.tencent.com/product/scf
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送、移动分析):https://cloud.tencent.com/product/mps
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯会议:https://cloud.tencent.com/product/tccon
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

派生函数非虚函数继承效果

而虚函数作用,主要是为了让父指针可以调用子类函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++函数主要作用是“运行时多态”,父中提供虚函数实现,为子类提供默认函数实现。...子类可以重写父函数实现子类特殊化。 2、纯虚函数:   C++包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数子类才能new出对象。   ...C++纯虚函数更像是“只提供申明,没有实现”,是对子类约束,是“接口继承”。   C++纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

7110

C#Abstract 、Virtual和Override使用

虚拟成员实现可由派生重写成员更改。调用虚方法时,将为重写成员检查该对象运行时类型。将调用大部分派生该重写成员,如果没有派生重写该成员,则它可能是原始成员。默认情况下,方法是非虚。...和抽象方法相同点是都用了override关键字进行重写方法,不同点是抽象方法必须存在于抽象,而子类必须重写,除非子类也是抽象。...由 override 声明重写方法称为重写方法。重写方法必须与 override 方法具有相同签名。不能重写非虚方法或静态方法。...重写属性声明必须指定与继承属性完全相同访问修饰符、类型和名称,并且被重写属性必须是 virtual、abstract 或 override 。...4. base和this区别 1)base作用:用于从派生访问成员,调用上已被其他方法重写方法。指定创建派生实例时应调用构造函数

1.2K20

C#override和new关键字

以override声明重写方法被称为被重写方法,被重写方法必须具有与重写方法相同签名。...new关键字:new修饰符用来明确地隐藏由继承而来成员。要隐藏继承而来成员,可以在派生中共用相同名称并用new修饰符修饰它。...所以 c2.fun()会调用父fun()方法,要想调用C2fun()方法必须吧c2强制转换为C2. ---- 下面看看微软官方文档解释: C# 语言经过专门设计,以便不同与派生之间版本控制可以不断向前发展...这具有多方面的意义。例如,这意味着在引入与派生某个成员具有相同名称新成员在 C# 是完全支持,不会导致意外行为。...它还意味着必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称继承方法新方法。 在 C# ,派生可以包含与方法同名方法。 方法必须定义为 virtual。

1.3K20

浅谈C#new、override、virtual关键字区别

一、New     在C#,new这个关键字使用频率非常高,主要有3个功能:         a)   作为运算符用来创建一个对象和调用构造函数。     b)   作为修饰符。    ...在本文中,只具体介绍new作为修饰符作用,在用作修饰符时,new关键字可以在派生隐藏方法,也就说在使用派生方法是调用方法是New关键字新定义出来方法,而不是方法。...二、Override     Override关键字主要是提供派生方法新实现,重写方法必须和Override方法具有相同签名,此关键字不可以用于重写非虚方法和静态方法,与其配套使用关键字是...与此同时,Override方法还不可以修改Virtual方法可访问性,Override方法和Virtual方法必须具有相同访问修饰符,不能使用修饰符 new、static、virtual 或abstract..."); } } 此demo运行结果;     这是新方法     这是虚方法 三、 Virtual Virtual 关键字允许在派生重写这些对象,默认情况下,方法是非虚

1.2K10

c#面试题抽象和接口区别-金三银四面试:C#程序员经常遇到30道基础面试题,想你所想

在C#,new关键字可用作运算符和修饰符。   (1)new运算符用于在堆上创建对象和调用构造函数。   (2)new修饰符用于隐藏成员继承成员。   ...重写方法提供从继承成员新实现。由重写声明重写方法称为重写方法。重写方法必须与重写方法具有相同签名。   不能重写非虚方法或静态方法。重写方法必须是虚拟、抽象或重写。   ...“多态性”指定义具有功能不同名称相同方法或属性多个能力,这些可由客户端代码在运行时交换使用。也就是由重载和重写实现多态。重载一般是同一一组同名方法,签名。...14、请解释流与文件有什么不同?   文件是一些具有永久存储及特定顺序字节组成一个有序具有名称集合。因此,对于文件,人们常会想到目录路径、磁盘存储、文件和目录名等方面。...可以将相同命名空间中部署到不同程序集中,也可以将不同命名空间中部署到一个程序集中。

1.9K20

【笔记】《Effective C++》条款26-55

(name-hiding), 至于这两个名称类型是否相同并不被考虑 这是非常危险特性, 如下图派生mf3函数会将两个mf3一起进行遮掩, 无论那两个函数类型和形式是什么样 因此对于公有继承来说...: 接口与默认实现, 也就是内=0外单独实现纯虚函数, 允许派生按照Base::interface来使用提供默认实现 非虚函数: 接口与强制实现, 不希望派生对这个接口进行改变 35..., 令用户只修改核心部分, 利用总接口来使用 NVI手法需要允许用户修改私有的虚函数, 这恰好是C++"派生可以重新定义继承来私有虚函数, 因为继承而来函数无关"这个特性应用 当派生需要使用一些内容时虚函数也会被写为...函数 非虚函数继承是静态绑定, 因此如果我们用指针指向派生对象, 然后调用这个非虚函数, 或者反之操作, 都只会调用指针本身声明那个类型下函数, 无关其实际对象类型 相类似的, 函数参数和引用在这类场景下也会产生相似的效果..., 在编译期才被具现化出来), 需要是隐式接口(参数被传入模板后受到模板调用)和编译期多态(不同模板参数具象化出不同模板导致了调用不同接口), 很难把握 隐式接口并不基于函数签名式决定, 而是按照模板内表达式决定

89030

《Effective C++》学习笔记

条款09:绝不在构造和析构过程调用虚函数 在构造函数和析构函数不要去调用虚函数,因为子类在构造/析构时,会调用父构造/析构函数,此时其中函数是调用父实现,这是父函数可能是纯虚函数...衍生如果声明了与同名函数(无论是虚、非虚,还是其他形式),都会掩盖掉所有同名函数,注意,是所有,包括参数不同重载函数,都会不再可见。...用tr1::function成员变量替换虚函数,从而允许包括函数指针在内任何可调用物搭配一个兼容于需求签名式。 将虚函数也做成另一个继承体系,然后在调用其添加一个指针来指向其对象。...对于嵌套从属类型名称(即依赖于模板参数类型一个子类型,例如迭代器),必须用typename来修饰,但不能在模板列和初始化列表修饰。...条款43:学习处理模板化名称 如果是模板,那么衍生直接调用成员函数无法通过编译器,因为可能会有特化版模板针对某个不声明该接口函数

1.1K20

Dart语法详解系列篇(三)-- mixin入门详解一、继承歧义

钻石问题示意图 (二)继承歧义缓解 不同编程语言有不同方法来处理这些重复继承问题,这里列举几个用比较多语言。...如果虚拟继承和非虚拟继承是混合,那么只有一个虚拟A,对于每个到A非虚拟继承路径,都有一个非虚拟A。C++需要显式地声明要使用特性是从哪个父调用(例如:Worker::Human.Age)。...这些协议定义了方法,没有提供具体实现。...接口就像抽象,它们指定方法签名而不实现任何行为。(“纯”接口,例如版本7之前Java接口,不允许接口中任何实现或实例数据。)...然而,即使当多个接口声明相同方法签名时,只要该方法在继承链任何位置实现(定义),它就会覆盖该方法在其上链任何实现(在它)。因此,在继承链任何给定级别上,任何方法最多只能有一个实现。

1.7K10

c++多重继承小结

如果一个从两个不同里继承两个同名成员,则需要在派生中使用限定符来区分他们。...即在从A和B派生出来c中使用a::Show()和B::Show()来区分从这两个那里继承show()方法 如果一个通过多种途径继承了一个非虚,则该类从每种途径分别继承非虚一个实例。...对实现这种特性,必须满足其他要求: 1》有间接虚派生包含直接调用间接构造函数构造函数,这对于间接非虚来说是非法; 2》通过优先规则解决名称二义性。...a传递给A这会有二义性 //c++在使用虚时禁止信息通过中间自动传递给 //因此上面的构造函数将初始化Bbw和Dd,a不会传递给子对象b也不会传递给D对象 /...A(const A &)这样做是合法,对于虚必须这样做,对于非虚,则是非法

62170

C++核心准则C.128:虚函数应该明确定义为virtual,overide或者final

明确virtual,overide或者final本身就是一种说明,而且让编译器可以捕捉派生之间类型或名称不匹配问题。然而,使用这三个两个或三个就是多余而且容易引发潜在错误。...:程序员期待函数隐式成为虚函数而且它真的就是了(但是代码读者看不出来);或者程序员期待函数隐式成为虚函数但是它不是(例如因为参数列表微小出入);或者程序员没有期待函数成为虚函数但是它是了(因为它恰巧拥有和某个虚函数相同签名...(但是代码读者看不出来);或者程序员期待函数隐式成为覆盖函数但是它不是(例如因为参数列表微小出入);或者程序员没有期待函数成为覆盖函数但是它是了(因为它恰巧拥有和某个虚函数相同签名--注意这些问题无论函数是否被明确地声明为虚函数都会发生...,因为程序员本来想生成即可能是虚函数,也可能是非虚函数) Enforcement(实施建议) Compare virtual function names in base and derived classes...比较和派生函数名称并且提示使用相同名称但不是override情况。 Flag overrides with neither override nor final.

43620

VC和GCC成员函数指针实现研究(三)

*ptr)(); return 0; } VC虚继承成员函数指针实现 因为是兼容虚继承和非虚继承,所以赋值部分汇编是一样。这里就不贴了。关键在于执行期它是怎么找到虚。...所以,在非第一个虚函数指针调用时,VC用了一个和多继承相同处理,即多一层vcall作地址偏移: image.png 图十六:VC多重虚继承非第一个虚地址偏移换算 也是因为虚调用传入...经过测试,GCC在空虚成员函数指针调用和非空虚不同,我们直接上调用汇编。...由于1,这个转换过程offset值不知道了。所以必须要靠成员函数指针把这个offset存> 下来。...如果非虚非静态成员函数签名和指针类型签名不一样,并且这两个类型转换时候地址会变化(不是第一个时候。要有offset来记录this偏移。这上面的sample都过于简单了。

78710

C#简单面试题目(三)

用sealed修饰有什么特点 sealed 修饰符用于防止从所修饰派生出其它。如果一个密封被指定为其他,则会发生编译时错误。 密封不能同时为抽象。...sealed修饰符主要用于防止非有意派生,但是它还能促使某些运行时优化。具体来说,由于密封用于不会有任何派生,所以对密封实例虚拟函数成员调用可以转换为非虚拟调用来处理。...子类覆盖此函数时,定义里可不加virtual关键字,函数声明要和完全一致!且此声明是必须。   不是纯虚函数时,父函数必须要实现。...重载是方法名称相同不同参数类型,不同参数个数,不同参数顺序。覆写提供了子类改变父方法行为实现(是进行函数重写)。 37.能够将非静态方法覆写为静态方法吗?   ...不能,覆写方法签名必须与被覆写方法签名保持一致,除了将virtual改为override。 38.C#中委托是什么?事件是不是一种委托?   委托可以把一个方法作为参数传递给另一个方法。

94910

abstract virtaul override new 及多态

将调用大部分派生该重写成员,如果没有派生重写该成员,则它可能是原始成员。 默认情况下,方法是非虚。不能重写非虚方法。...override、virtual 和 new 关键字还可以用于属性、索引器和事件。 在 C# ,派生中方法名称可与中方法名称相同。...,那使用调用a时发布是B中方法,C中方法) 如果希望派生成员具有成员相同名称,但又不希望派生成员参与虚调用,则可以使用 new 关键字。...new 关键字放置在要替换成员返回类型之前 使用新成员隐藏成员(其实就是new与override区别,从文字上来说一个是隐藏一个是重写) 如果希望派生成员具有成员相同名称,...在运行时,客户端代码调用该方法,CLR 查找对象运行时类型,并调用虚方法重写方法。因此,你可以在源代码调用方法,执行该方法派生版本。

74730

C++函数重载、隐藏、覆盖和重写区别

比如派生成员函数屏蔽与其同名成员函数成员函数屏蔽全局外部函数。请注意,如果在派生存在与函数同返回值、同名且同形参函数,则构成函数重写。 2.2用法用例 请仔细研读以下代码。...: (1)派生成员函数成员函数同名参数不同。...此时成员函数将被隐藏(注意别与重载混淆,重载发生在同一个); (2)函数重载发生在同一作用域,函数隐藏发生在不同作用域。...如果派生定义了一个与函数同名参数列表不同非virtual函数,则此函数是一个普通成员函数非虚函数),并形成对同名虚函数隐藏,而非虚函数覆盖(重写)。...例如,可以对虚函数采用“实调用”,即尽管被调用是虚函数,但是被调用函数地址还是在编译阶段静态确定,那么派生函数仍然形成对函数同名隐藏。

7.7K62

C Sharp(四)

通常我们称一个为派生时,我们是说他直接派生自某个而不是 object。 屏蔽成员 我们虽然不能删除任何成员,但是我们可以使用与相同名称成员来屏蔽成员。...在派生屏蔽成员要点如下: 要屏蔽一个数据成员,需要声明一个新相同类型同名成员 要屏蔽一个函数成员,需要在派生声明带有相同签名函数成员 要然编译器知道我们故意屏蔽成员,需要使用 new...虚方法和覆写方法 虚方法可以使引用访问”提升”至派生,只需满足如下条件: 派生方法和方法签名和返回值都一致 方法使用 virtual 标注 派生方法使用 override 标注...: 覆写和被覆写方法必须具有相同访问性 不能覆写 static 方法和非虚方法 方法、属性、索引器和事件可以被声明为 virtual 和 override 覆写方法可以在继承任何层次出现,方法调用会沿着派生层次一直追溯到标记为...构造函数执行 派生对象有一部分就是对象: 要创建对象部分,需要隐式调用某个构造函数作为实例创建一部分 每个在执行自己构造函数之前要执行构造函数 默认情况,构造对象时,

60320

C++核心准则​讨论:将析构函数设为公共和虚拟,或受保护非虚

否则,应该对其进行保护,以便只有派生才能在自己析构函数调用它,这个析构函数也应该是非虚,因为它不需要虚拟地运行。...如第39项所述,对于普通成员函数,选择之间是允许以非虚拟方式(通过指向Base指针)调用它(如果它调用虚拟函数(例如在NVI或模板方法模式),则可能具有虚拟行为) ),实际上还是根本没有。...析构可以看作只是另一种操作,尽管具有使非虚调用变得危险或错误特殊语义。因此,对于析构函数,选择是根据是否允许通过指向Base指针实际上调用它。“非虚”不是一种选择。...因此,如果可以调用(即是公共析构函数,则它是虚拟,否则是非虚。...推论:编写时,请始终显式编写一个析构函数,因为隐式生成是公共非虚。如果默认函数就很好,那么您只需要决定器可见性和虚函数性,则实现可以直接使用=default。

1.1K20

正确使用 new 修饰符

几乎 .NET 所有开发人员都知道 new 修饰符可以重新定义从中继承非虚成员,但是大部分开发人员并不知道怎么才能正确使用,甚至出现了滥用情况。...上面的代码 Demo 继承自 DemoBase ,好多开发人员看到这段代码就会认为两次调用 Method 方法结果应该是相同,但是实际运行后发现输出结果是不同。...除非是里面的方法和派生方法重名情况才可使用 new 修饰符。...这种情况一般出现在和派生已经被大量使用,修改派生方法名称会导致更大修改,这时我们就可以在派生重名方法上使用 new 操作符。...我们在使用 new 修饰符前应该考虑清楚以后可能带来后果,如果后其成本比直接修改名称要高,那么就应该修改派生重名方法名称

33220

C#学习基础之一——面向对象编程及new用法总结

int x; public void Invoke() {} } 在派生中用 Invoke 名称声明成员会隐藏 Invoke 方法,即: public class MyDerivedC...: MyClass { new public void Invoke() {} } 通过继承隐藏名称采用下列形式之一: 1.引入或结构常数、指定、属性或类型隐藏具有相同名称所有成员...2.引入或结构方法隐藏具有相同名称属性、字段和类型。同时也隐藏具有相同签名所有方法。 3.引入或结构索引器将隐藏具有相同名称所有索引器。...示例 在该例 MyBaseC 和派生 MyDerivedC 使用相同字段名 x,从而隐藏了继承字段值。该例说明了 new 修饰符使用。...示例 在该例,嵌套 MyClass 隐藏了具有相同名称。该例不仅说明了如何使用完全限定名访问隐藏成员,同时也说明了如何使用 new 修饰符消除警告消息。

79320

《Effective C++》读书摘要

七、多态声明虚析构函数 (不)具有多态性质(不)需要虚析构函数; 八、不让异常逃出析构 异常时终止或者吞下; 将可能抛出异常代码提供给用户管理; 九、不在构造和析构调用虚函数 调用后仅仅是自身函数...(六)、继承与面向对象设计 三十二、确定public继承塑膜出is-a关系 适用于事情也适用于子类。 三十三、避免遮掩继承来名称 重载函数一旦在子类被重写后,其他同名函数无法访问。...使得不同功能通过继承HealthCalcFunc改变。 三十六、绝不定义继承非虚函数 重修继承非虚函数导致函数访问由指向对象指针或引用类型决定。...四十二、typename双重含义 模板声明与class没有任何区别; 嵌套从属类型显式指定,不能出现在列表和初始化列表; ?...四十三、处理模板化名称 继承模板化名称不能像继承一样使用:通过this->名字修饰、using ::名字、或者::名字一共三种修饰方式。第三种导致虚函数功能失效。

1.9K60

第 15 章 面向对象程序设计

而对于非虚函数调用是在编译时进行绑定。类似的,通过对象进行函数(虚函数非虚函数)调用也在编译时绑定。 一旦某个函数被声明为虚函数,则在所有派生它都是虚函数。...而对于派生覆盖函数,其形参必须相同,返回类型也要与匹配。而当虚函数返回类型是本身指针或引用且可进行类型转换时,也是允许。 ?...因为我们调用是一个成员,所以该类型必然是类型。 在 p(或obj)静态类型对应查找 mem。如果找不到,则依次在直接不断查找直至到达继承链顶端。...using声明语句不能指定 explicit或 constexpr,继承构造函数将与相应函数具有相同属性。...派生定义构造函数构造函数具有相同形参列表时,则该构造函数不会被继承,派生中使用是自己定义相应函数。 默认、拷贝和移动构造函数不会被继承,这些构造函数按照正常规则被合成。

1K30
领券