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

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

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

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

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

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

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

相关·内容

【C++】模板继承多态

函数模板 意义:对类型进行参数化 模板实参推演:可以根据用户传入实参类型推导出模板类型函数模板 不会参与编译,函数调用点,实例化/推导出类型,模板函数再进行编译。...模板一般都是放在头文件中源文件中展开 函数模板类型参数 必须是整数类型(整数/地址/引用)都是常量,只能使用 继承 继承本质和原理 继承··本质·: a.代码复用 b.中给所有派生类提供统一函数接口...中·定义成员,想被派生类访问,但是不想被外界访问,那么中,把相关成员定义成protected保护,如果派生类和外部都不打算访问,那么中,就把相关成员定义成private私有的 默认继承方式...: class定义派生类,默认继承方式就是private私有的 struct定义派生类,默认方式就是public 派生类从继承可以继承所有的成员(变量和方法),除过构造函数和析构函数 派生类怎么初始化从继承成员变量呢...是由构造和析构负责 派生类对象构造和析构过程是: 派生类调用构造函数,初始化从继承成员。 调用派生类自己构造函数

9910

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关系,所以该转换是安全)...主要在以下几种场合中使用: 用于层次结构中,和子类之间指针和引用转换;当进行上行转换(把派生类指针或引用转换成表示),这种转换是安全;当进行下行转换(把指针或引用转换成派生类表示)

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

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

    2.2K50

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

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

    36910

    【C++篇】继承之韵:解构编程奥义,感悟面向对象至高法则

    派生类对象 s 被传递给引用 p,并正确调用了 Student 重写函数 Print()。 2.2.3 强制类型转换使用 在某些特殊情况下,指针或引用可能需要转换为派生类指针或引用。...C++ 提供了 dynamic_cast、static_cast 等多种类型转换方式。继承关系中,使用 dynamic_cast 进行安全类型转换尤为重要,特别是处理多态时。...如果派生类定义了与成员同名变量或函数同名成员将被隐藏,这种现象称为隐藏(Hiding)。也叫重定义同名成员派生类中会覆盖成员,导致成员无法被直接访问。...为了访问 _num,我们使用了 Person::_num 显式地指定访问成员。这样可以避免由于成员同名而导致混淆。 注意在实际中继承体系里面最好不要定义同名成员。...如果我们希望调用 fun() 函数,必须通过 b.A::fun() 显式调用。这与函数重载不同,函数隐藏仅要求函数名相同,而不考虑参数列表。

    9310

    第 19 章 特殊工具与技术

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

    74740

    第 19 章 特殊工具与技术

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

    82850

    C++:特殊设计和四种类型转换

    析构函数设置成私有同样会导致对象无法栈上进行创建。因为自定义类型栈帧中销毁时候会去自动调用他析构函数,但是因为调不到所以会报错。...转型是安全) 注意: 1. dynamic_cast只能用于父含有虚函数 2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr。...3、为什么 dynamic_cast只能用于父含有虚函数 dynamic_cast转换是在运行时进行转换,因为只有对于这种类层次结构,才应该将派生类地址赋给指针。...因为派生类会继承函数表,所以通过这个虚函数表,我们就可以知道该类对象转换时候就可以用来判断对象有无继承关系。 所以虚函数对于正确指针转换为子类指针是非常重要。...C++通过以下方式支持RTTI: 1. typeid运算符(返回指出对象类型值) 2. dynamic_cast运算符(根据虚表判断有无继承关系,并判断是否可以转化) 3. decltype

    12610

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

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

    1.4K31

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

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

    72330

    QT(C++)面试总结

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

    2.1K10

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

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

    84840

    【笔记】《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

    92830

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

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

    1.1K20

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

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

    2.5K30

    【C++高阶】:特殊设计和四种类型转换

    1.4.1 C++98做法: 构造函数私有化,这样子类调用不到父构造函数,无法实现继承 // C++98中构造函数私有化,派生类中调不到构造函数。...3、为什么 dynamic_cast只能用于父含有虚函数 dynamic_cast转换是在运行时进行转换,因为只有对于这种类层次结构,才应该将派生类地址赋给指针。...因为派生类会继承函数表,所以通过这个虚函数表,我们就可以知道该类对象转换时候就可以用来判断对象有无继承关系。   所以虚函数对于正确指针转换为子类指针是非常重要。...C++通过以下方式支持RTTI: typeid运算符(返回指出对象类型值) dynamic_cast运算符(根据虚表判断有无继承关系,并判断是否可以转化) decltype(推断表达式返回值类型...内置类型和自定义类型之间——————————————————*/ //1、自定义类型 = 内置类型 -> 构造函数支持 (单参数和多参数隐式类型转换时通过构造函数来支持) // 2、内置类型 =

    9010

    十、继承

    使用继承原因 面向对象编程(OOP)中,继承是一种非常重要特性,它提供了多种理由和优势支持其使用。 代码复用: 继承允许我们重用中已经定义属性和方法,而不必派生类中重新定义它们。...通过继承,我们可以定义指针或引用来指向派生类对象,并在运行时根据对象实际类型调用相应方法。这种能力使得我们代码更加灵活和强大。...通过继承,可以定义指针或引用来指向派生类对象,并在运行时根据对象实际类型调用相应方法。 扩展性:派生类可以继承基础添加新属性和方法,从而扩展功能。...虚函数和纯虚函数:通过声明虚函数或纯虚函数,可以定义接口,让派生类实现这些接口具体行为。这是实现多态性关键。...继承中同名成员 C++中,当子类(派生类)和父)中存在同名成员时,这些成员实际不同作用域中定义。这种情况主要涉及到成员函数(方法)和成员变量(属性)。

    7010

    轻松搞定面试中“虚”

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

    67620

    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。

    54540

    十三、异常、类型转换和 lambda

    异常规范 C++98 中,函数可以使用异常规范声明它们可能抛出异常类型。然而,从 C++11 开始,异常规范(除了 noexcept)被认为是弃用并在 C++17 中被彻底移除。...std::bad_exception(注意:这实际不是一个常用异常,因为某些实现中它不存在或未被广泛使用):这个异常用途并不明确,且某些C++标准库实现中可能不存在。...它可能是作为设计,但实际很少被直接使用。 std::bad_typeid:当在typeid操作中使用了nullptr或指向非多态类型对象指针时抛出。...(如派生类转换,但注意指针或引用不能直接转换为派生类指针或引用,除非使用dynamic_cast)。...lambda C++中lambda表达式是一种定义匿名函数对象方式。它们提供了一种简洁、灵活机制编写可以需要函数对象地方使用代码块。

    6410
    领券