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

使用`dynamic_cast`来推断在基类上定义并在派生类上实现的成员函数的参数类型是否正确?

使用dynamic_cast来推断在基类上定义并在派生类上实现的成员函数的参数类型是否正确是不正确的做法。dynamic_cast主要用于在运行时进行类型转换,用于将基类指针或引用转换为派生类指针或引用。它可以检查指针或引用是否指向了有效的派生类对象,但不能用于检查成员函数的参数类型是否正确。

在C++中,成员函数的参数类型是在编译时确定的,而不是在运行时。编译器会根据函数的声明和定义来检查参数类型是否匹配。如果在基类中定义了一个虚函数,并在派生类中进行了重写,那么编译器会根据函数的声明来检查参数类型是否正确。

如果使用dynamic_cast来检查参数类型是否正确,会导致编译错误或运行时错误。因此,不建议使用dynamic_cast来推断成员函数的参数类型是否正确。正确的做法是在编译时仔细检查函数的声明和定义,确保参数类型的匹配性。

关于dynamic_cast的更多信息,可以参考C++的官方文档:dynamic_cast

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

RTTI和类型转换运算符

1.1 RTTI三个元素 由于只有包含虚函数层次结构,才能将派生类对象地址赋给指针,因此RTTI只适用包含虚函数。...dynamic_cast运算符将使用一个指向指针来生成一个指向派生类指针,否则,该运算符返回0—空指针。 typied运算符返回一个指出对象类型值。...1.1.3. type_info type_info主要存储了有关特定类型信息,其中包含了一个name()成员,该成员函数主要用于调试,其需要与typeid搭配使用使用方法如下: //class...类型转换运算符 2.1 dynamic_cast 前面已经介绍过其用法,该运算符主要用途是,使得能够层次结构中进行向上转换(即派生类转换,由于该转换是is-a关系,所以该转换是安全)...主要在以下几种场合中使用: 用于层次结构中,和子类之间指针和引用转换;当进行上行转换(把派生类指针或引用转换成表示),这种转换是安全;当进行下行转换(把指针或引用转换成派生类表示)

56730

【专业技术】C++ RTTI及“反射”技术

一些面向对象专家传播自己设计理念时,大多都主张在设计和开发中明智地使用虚拟成员函数,而不用 RTTI 机制。但是,很多情况下,虚拟函数无法克服本身局限。...答案是使用内建 RTTI 中运算符:typeid 和 dynamic_cast。   首先让我们设计一个层次,假设我们创建了某个处理文件抽象。...(dtor)   };   现在从 File 派生实现纯虚拟函数,同时还要提供一些其他操作。...假设派生类为 DiskFile,除了实现纯虚拟函数外,还要实现自己flush()和defragment()操作: class DiskFile: public File {   public:...用它确定某个对象是 MediaFile 对象还是它派生类对象。dynamic_cast 常用于从多态编程指针向派生类指针向下类型转换。

2.1K50

封装、继承、多态、重载:C++中强大特性与代码设计

C++中,使用关键字class或struct定义一个,并使用关键字public、private或protected指定成员访问权限。...旧被称为或者父,新被称为派生类或者子类。 多态 C++中多态是面向对象编程一个重要概念,它允许使用指针或引用来处理不同类型对象,而实际执行是根据对象类型动态选择相关操作。...C++中多态性主要通过虚函数(virtual function)和运行时类型识别(runtime type identification)两个机制实现: 虚函数中声明虚函数并在派生类中进行重写...当通过指向指针或引用调用虚函数时,将根据实际对象类型选择正确函数实现。这种动态选择函数机制称为动态绑定(dynamic binding)。虚函数通过关键字virtual进行声明。...多态实现 静态绑定:在编译期决定 函数重载 运算符重载 模板 动态绑定:程序运行时执行 虚函数函数概念: 中冠以关键字virtual成员函数 定义: virtual函数类型

12610

第 19 章 特殊工具与技术

,用于将指针或引用安全地转换为派生类指针或引用。...当我们想使用对象指针或引用执行某个派生类操作,并且该操作不是虚函数时,上面两个运算符,就可以发挥作用。...这里指针或引用转化为派生类指针或者引用**,需要注意是该指针需要指向派生类对象才可以,否则指向对象指针或引用是不可能转化为派生类指针或引用**!...{ return &Screen::contens; } // 其他成员与之前版本一致 }; 同样也可以定义指向成员函数指针,最简单方法是使用 auto推断类型。...---- 19.7 局部类 局部类是指定义某个函数内部,局部类定义类型定义作用域内可见。 局部类所有成员(包括函数在内),都必须完整定义内部。

71740

第 19 章 特殊工具与技术

,用于将指针或引用安全地转换为派生类指针或引用。...当我们想使用对象指针或引用执行某个派生类操作,并且该操作不是虚函数时,上面两个运算符,就可以发挥作用。...这里指针或引用转化为派生类指针或者引用**,需要注意是该指针需要指向派生类对象才可以,否则指向对象指针或引用是不可能转化为派生类指针或引用**!...{ return &Screen::contens; } // 其他成员与之前版本一致 }; 同样也可以定义指向成员函数指针,最简单方法是使用 auto推断类型。...---- 19.7 局部类 局部类是指定义某个函数内部,局部类定义类型定义作用域内可见。 局部类所有成员(包括函数在内),都必须完整定义内部。

79350

常见c和cpp面试题目汇总(一)

关键字可有可无 override,派生类覆盖函数实现接口重用;特征:不同范围(派生类)、函数名字相同、参数相同、中必须有virtual关键字(必须是虚函数) overwrite,派生类屏蔽了其同名函数...如果析构函数不被声明成虚函数,则编译器实施静态绑定,删除指向派生类指针时,只会调用析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。...只有虚函数使用是动态绑定,其他全部是静态绑定 十五、引用是否实现动态绑定,为什么引用可以实现: 可以。...因为引用(或指针)既可以指向对象也可以指向派生类对象,这一事实是动态绑定关键。用引用(或指针)调用函数在运行时确定,被调用函数是引用(或指针)所指对象实际类型定义。...,转换时执行必要检测(指针越界、类型检查),其操作数相对是安全 2)dynamic_cast:运行时检查 用于集成体系中进行安全向下转换downcast,即指针/引用->派生类指针/引用

1.2K31

CC++数据类型转换之终极无惑

具体说,dynamic_cast可以进行如下类型转换。 (1)指向指针(引用)与指向派生类指针(引用)之间进行转换。...(2)多重继承情况下,派生类多个之间进行转换(称为交叉转换:crosscast)。如父A1指针实际指向是子类,则可以将A1转换为子类另一个父A2指针。...也就是说,若干重载构造函数中,有一些接受一个基本数据类型作为参数,这样就可以实现从基本数据类型对象转换。...类型转换函数与普通成员函数一样,也可以体中声明,定义。 (2)类型转换函数通常是提供给客户使用,所以应将访问权限设置为public,否则无法被显示调用,隐式类型转换也无法完成。...dynamic_cast能够实现运行时动态类型检查,依赖于对象RTTI(Run-Time Type Information),通过虚函数表找到RTTI确定指针所指对象真实类型确定能否转换。

70330

QT(C++)面试总结

单继承和多继承 单继承(派生类只从一个直接继承)时派生类定义: class 派生类名:继承方式 名 { 新增成员声明; } 多继承时派生类定义: class 派生类名:继承方式1...2)访问权限 派生类成员函数:可以直接访问public和protected成员,但不能直接访问private成员; 通过派生类对象:只能访问public成员。...通过对象名、指针只能使用继承成员派生类新增成员就不能使用了 Qt4与Qt5三个区别 1.新增widgets模块 Qt4中,Qt提供全部图形界面相关都包含在Qt Gui模块中...多态:同一操作作用于不同对象,可以有不同解释,产生不同执行结果。在运行时,可以通过指向指针,调用实现派生类方法。...C++中,实现多态有以下方法:虚函数,抽象,覆盖,模板(重载和多态无关)。 C++ (纯虚函数和抽象) a. 纯虚函数是一个中只有声明函数,中无定义

1.8K10

【笔记】《C++Primer》—— 第19章:特殊工具与技术

(RTTI)是一种比较危险操作,我们想使用对象指针或引用来执行某个派生类非虚函数使用,相关运算符是typeid和dynamic_cast,如果可以的话最好还是应该用虚函数而不是直接改变类型...typeid可以返回表达式类型dynamic_cast指针或引用强制转为派生类指针或引用 dynamic_cast有模板参数,是目标要转换类型,通常情况下应该有虚函数,是指针,左值引用或右值引用...,编译器只能保证不同类型名字是不同 RTTI关键用处在于当我们想为具有继承关系实现相等运算符时,如果我们想到用虚函数派生类返回比较结果,但是我们equal为了保证接受不同类型必须接受引用...我们应该使用RTTI,首先用typeid去对比两个对象类型类型不同便必定不相等,可以返回;如果相同,我们仍然使用函数来比较成员,但是这次用引用读取对象后,由于我们相当于已经知道对象真正类型了...,将调用运算符转为指针调用 C11多了一种简单一些方法是使用标准库功能mem_fn让编译器自己去推断成员类型,也就是需要传入可调用对象地方改写为mem_fn(&Screen::testFunction

80740

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

, 因为它是编译期实现, 无法动态得知当前对象继承关系 dynamic_cast适用于需要为一个认定为派生类动态调用非虚派生类函数, 这是static_cast做不到....: 所有可以使用地方, D也可以派上用场, 尽管具体行为可能有所不同 不同行为应该用虚函数实现, 这非常重要 应该尽可能阻断那些派生类不同接口, 运行期方法是派生类对应函数中用..., 令用户只修改核心部分, 但利用总接口来使用 NVI手法需要允许用户修改私有的虚函数, 这恰好是C++中"派生类可以重新定义继承私有虚函数, 因为继承而来函数无关"这个特性应用 当派生类需要使用一些内容时虚函数也会被写为...deque, 只是依据deque而已) 39 明智而审慎地使用private继承 由于访问限制原因, 编译器无法自动将private继承派生类转型为, 且派生类无法使用成员 因此private...继承实际同样表示has-a/is-implemented-in-terms-of关系, 意味着我们只需要继承实现而无需对应接口, 只能通过重新定义函数使用对应实现 但是private

87530

C++复习大全(各种知识点)

,最后改写为指针运算 派生类定义名字(对象或函数名)将义无反顾地遮蔽(隐藏)中任何同名对象或函数  函数原型完全相同,当返回类型不同时称为协变  运行时多态  当许多派生类因为继承了共同而建立...通过这个指针或者引用调用函数,包括通过指针反引用调用虚函数,因为反引用一个指针将返回所指对象引用使用dynamic_cast和typeid运算符  优点  应用程序不必为每一个派生类编写功能调用...因此,静态成员本质就是一种全局变量或函数。...class之外,但是不同是它们不需要this指针参数静态成员也会被派生类继承,但这种继承并不是继承它们实体,而是使得它们能在派生类中直接访问。...函数重载内部实现机制其实是编译器对函数名字进行了修饰:通过函数参数不同而改变函数名字,这样就可以实现实际调用是两个不同函数一个很有趣结论->通过返回值重载  猜想:既然可以通过参数或者范围实现重载

98020

C++数据类型转换之终极无惑

具体说,dynamic_cast可以进行如下类型转换。 (1)指向指针(引用)与指向派生类指针(引用)之间进行转换。...(2)多重继承情况下,派生类多个之间进行转换(称为交叉转换:crosscast)。如父A1指针实际指向是子类,则可以将A1转换为子类另一个父A2指针。...也就是说,若干重载构造函数中,有一些接受一个基本数据类型作为参数,这样就可以实现从基本数据类型对象转换。...类型转换函数与普通成员函数一样,也可以体中声明,定义; (2)类型转换函数通常是提供给客户使用,所以应将访问权限设置为public,否则无法被显示调用,隐式类型转换也无法完成;...dynamic_cast能够实现运行时动态类型检查,依赖于对象RTTI(Run-Time Type Information),通过虚函数表找到RTTI确定指针所指对象真实类型确定能否转换。

2.5K30

轻松搞定面试中“虚”

包括:虚函数,纯虚函数,虚,虚继承... 1.什么是虚函数,有什么作用? 用virtual声明成员函数为虚函数。这样就可以派生类中重新定义函数,为它赋予新功能,并能方便地被调用。...虚函数作用是允许派生类中重新定义类同名函数,并且可以通过指针或引用来访问派生类同名函数,达到多态目的。 2.什么是纯虚函数,什么是纯虚,有什么作用?...5.是否可以将构造函数声明为virtual? 虚函数意思就是开启动态绑定,程序会根据对象动态类型选择要调用方法。...vtable,通过指针做虚函数调用时,也就是多态调用时,编译器静态地插入取得这个vptr,并在vtable表种查找函数地址代码,这样就能调用正确函数。...c++通过下面两个操作符提供RTTI: (1)typeid:返回指针或引用所指对象实际类型。 (2)dynamic_cast:将类型指针或引用安全转换为派生类型指针或引用。

65020

C++小知识系列之“父指针”和dynamic_cast

什么是父指针 父指针也可以称为指针,当父()指针指向派生类(子类)指针时候,可以触发“多态效果”。...正如上文所说,派生类指针原则不能指向对象,但其实我们仍然可以强行转换: Base base; base.fun(); Derived* from_base_ptr = static_cast<Derived...,即使derived_fun(Derived* this)中Derived*参数传过来不对,但在该函数内部并没有使用参数,所以其不影响函数运行(derived_fun函数内部仅仅执行了打印函数而已...dynamic_cast: 不过话说回来,如果这个指针是由派生类转换过来,那么是可以正常转换,即使派生类包含了非虚函数以及需要解引用,下面的代码是没有任何问题: Base* base_ptr...因此,实际应用中,能在编译时解决掉问题不要留到运行时、能用多态搞定事情也没必要使用dynamic_cast或typeid。

28540

《C++Primer》第十五章 面向对象程序设计

负责定义层次关系中所有共同拥有的成员,而每个派生类定义各自持有的成员C++中类型相关函数派生类不做改变直接继承函数区分对待。...正确:动态类型是Bulk_quote Bulk_quote *bulkP = itemP; // 错误:不能将转换成派生类 编译器在编译时无法确定某个特定转换在运行时是否安全,这是因为编译器只能通过检查指针或引用静态类型推断该转换是否合法...如果中含有一个或者多个虚函数,我们可以使用dynamic_cast请求一个类型转换,该转换安全检查将在运行时执行。...另外某些定义方式也可能导致有的派生类成员称为被删除函数: 如果默认构造函数、拷贝构造函数、拷贝赋值运算或析构函数是被删除函数或者不可访问,则派生类中对应成员将是被删除,原因是编译器不能使用成员执行派生类对象部分构造...如果含有几个构造函数,则除了两个例外情况外大多数派生类会继承所有的构造函数: 如果派生类定义构造函数构造函数有相同参数列表,则该构造函数不会被继承,定义派生类构造函数会替换继承而来构造函数

1.2K20

C++核心准则C.120:层次体系只用于表现固有的阶层结构‍

确保用表现想法准确地匹配所有的派生类型并且找不到使用继承这样紧耦合之外更合适方式。...不要仅仅因为某个数据成员需要继承就使用继承。继承通常意味着派生类型需要覆盖某个函数或者需要访问保护成员。...这段代码接口定义函数大多数派生类都无法很好地实现成了实现负担。进一步说,容器用户实际无法依赖成员函数合理,高效地执行有意义操作;它可能会抛出异常。...因此用户必须求助于运行时检查以便决定用或不用这个普遍接口而选择通过动态类型查询(例如dynamic_cast)获得特殊接口。...在所有使用非公开B而派生类D没有覆盖B函数或者访问B保护型数据成员时进行提示。其中B不属于下面的情况:空,D模板参数参数包,被D特化模板

34420

【c++】继承学习(一):继承机制与派生类转换

使用引用和指针时不会发生切片 对象切片问题仅在派生类对象被赋值给另一个类型对象时才会发生,比如当派生类对象被传值给一个对象函数参数,或者通过赋值构造一个新对象。...这里如果是多态类型,可以使用RTTI(Run-Time Type Information)dynamic_cast 进行识别后进行安全转换 3.继承中作用域 继承体系中派生类都有独立作用域...如果在派生类中尝试访问一个被隐藏成员,需要显式地使用名限定符指定成员 Print 方法中使用 Person::_num 来访问 Person 中 _num 成员。...C++ 规则规定,如果派生类提供了和类同名函数中同名函数派生类作用域就不再可见了 因此, B 成员函数 fun(int) 中,调用 fun() 试图无参数调用被隐藏同名函数会无法编译...,因为编译器认为我们试图调用 fun(int) 这个版本,但没有提供参数,导致参数不匹配 修复 为了调用 A fun 函数,我们必须显式地使用作用域解析运算符 :: 指明我们想要调用函数属于作用域

19310

C++核心准则C.120:层次体系只用于表现固有的阶层结构‍

确保用表现想法准确地匹配所有的派生类型并且找不到使用继承这样紧耦合之外更合适方式。 ...不要仅仅因为某个数据成员需要继承就使用继承。继承通常意味着派生类型需要覆盖某个函数或者需要访问保护成员。 ...这段代码接口定义函数大多数派生类都无法很好地实现成了实现负担。进一步说,容器用户实际无法依赖成员函数合理,高效地执行有意义操作;它可能会抛出异常。...因此用户必须求助于运行时检查以便决定用或不用这个普遍接口而选择通过动态类型查询(例如dynamic_cast)获得特殊接口。 ...在所有使用非公开B而派生类D没有覆盖B函数或者访问B保护型数据成员时进行提示。其中B不属于下面的情况:空,D模板参数参数包,被D特化模板

37540

【笔记】《C++Primer》—— 第三部分:设计者工具

派生类一般构造函数开始地方调用构造函数,让初始化自己成员 静态类型是变量本身代码中类型,在编译时决定,动态类型是变量在内存中对象类型,在运行时才能决定。...定义方法是声明函数时候函数体类似显式默认构造写法改写为=0,只能对虚函数使用这个写法 友元只对被声明有效,友元派生类都不是友元 某个对其继承成员访问权限受到两个因素影响:...using声明需要改变名称(用::作用域符特指名称) 派生类转换也与派生列表访问说明符有关,本质类型转换函数权限有关 名称查找是根据编译时目标的静态类型从内到外进行查找,目标的静态类型决定了其是否可见...,对于实现内容我们一样可以使用=default简化 如果基本操作函数不可访问或被删除,则派生类对应成员是被删除因为我们无法使用操作那些成员 C11中,我们可以用using重用定义构造函数...模板不会推断参数类型 模板成员函数只有使用时才会实例化 模板与另一个模板直接最常见友元是一对一友元,首先模板需要声明所有需要用到名字,然后声明友元时标注出目标具体模板实参 模板也可以一对多友元

1.7K10

本周阅读:深度探索C++对象模型

;(普通就不会了) 情况3 带有虚函数(添加额外信息) 情况4 带有虚构造函数,有成员构造函数,还有自己构造函数,哪有优先执行(混乱)?...派生类构造函数执行顺序: 按照继承顺序 调用默认构造函数 按照成员变量声明顺序,如果初四化成员列表 指定构造函数,就用指定。不如就是默认。...一个对于默认拷贝赋值操作, 以下情况不会表现出bitwise拷贝语意: * 当内带一个成员对象, 而其有一个拷贝赋值操作时 * 当一个有一个拷贝赋值操作时 * 当一个声明了任何虚函数...: 派生类构造函数中, 所有虚以及一层构造函数会被调用 上述完成之后, 对象vptr会被初始化, 指向相关虚表 如果有成员初始化列表的话, 将在构造函数体内扩展开来; 这必须在vptr...各个section解释见 gcc编译器实现中虚函数表vtable存放在可执行文件只读数据段.rodata中 虚表属于一个,里面存储自己不同对象 5 总结:构造函数执行算法 构造函数执行算法

75820
领券