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

MISRA C++ 2008规则5-2-3建议:不应在多态类型上执行从基类到派生类的强制转换

MISRA C++ 2008规则5-2-3建议:不应在多态类型上执行从基类到派生类的强制转换。

这个规则是MISRA C++ 2008标准中的一条建议,旨在避免在多态类型上执行从基类到派生类的强制转换。在C++中,多态性是通过虚函数和继承实现的,它允许在基类指针或引用上调用派生类的成员函数。然而,强制类型转换可能会破坏多态性的特性,导致不可预测的行为和潜在的错误。

这个规则的目的是确保代码的可靠性和可维护性。在多态类型上执行强制转换可能会导致类型不匹配和未定义行为。因此,建议避免在多态类型上使用强制转换,以减少潜在的错误和问题。

在实际开发中,可以通过遵循以下几点来遵守这个规则:

  1. 尽量避免在多态类型上执行强制转换。如果需要进行类型转换,可以考虑使用dynamic_cast运算符来进行安全的向下转型,它会在运行时检查类型信息,避免类型不匹配的问题。
  2. 在设计和实现类的继承关系时,要考虑到多态性的特性,避免在基类和派生类之间存在需要进行强制转换的情况。合理的类设计和继承关系可以减少强制转换的需求。
  3. 在进行类型转换时,要进行必要的错误检查和处理。如果转换失败,要根据实际情况采取适当的错误处理措施,例如抛出异常或返回错误码。

总之,遵守MISRA C++ 2008规则5-2-3的建议可以提高代码的可靠性和可维护性,避免潜在的错误和问题。在实际开发中,可以结合具体的业务需求和技术场景来选择合适的解决方案和腾讯云相关产品。

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

相关·内容

C++类型转换

// 所以非常BUG,下面转换函数指针代码是不可移植,所以建议这样用 // C++不保证所有的函数指针都被一样使用,所以这样用有时会产生不确定结果 // FUNC...-> A tmp(1); A a2(tmp); A a2 = 1; } 三、常见面试题 说说C++4中类型转化应用场景 static_cast,命名理解是静态类型转换 使用场景: 用于层次结构中派生类之间指针或引用转换...注意: 上行转换派生类—->)是安全;下行转换—->派生类)由于没有动态类型检查,所以是不安全。...用于基本数据类型之间转换,如把int转换为char,这种带来安全性问题由程序员来保证 使用特点: 主要执行多态转换操作,用于代替C中通常转换操作 隐式转换建议使用static_cast...进行标明和替换 dynamic_cast,命名理解是动态类型转换 使用场景: 只有在派生类之间转换时才使用dynamic_cast,type-id必须是指针,引用或者void 使用特点:

1.9K20

C语言与C++面试知识总结

另外还可以定义与 struct Student 冲突 void Student() {}。 C++ 中 由于编译器定位符号规则(搜索规则)改变,导致不同于C语言。...Polymorphism,编译期):模板、函数模板 强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换 静态多态(编译期/早绑定) 函数重载 class...static_cast 用于非多态类型转换 执行运行时类型检查(转换安全性不如 dynamic_cast) 通常用于转换数值数据类型(如 float -> int) 可以在整个层次结构中移动指针...,子类转化为父安全(向上转换),父转化为子类不安全(因为子类可能有不在父字段或方法) dynamic_cast 用于多态类型转换 执行行运行时类型检查 只适用于指针或引用 对不明确指针转换将失败...(RTTI) dynamic_cast 用于多态类型转换 typeid typeid 运算符允许在运行时确定对象类型 type_id 返回一个 type_info 对象引用 如果想通过指针获得派生类数据类型

4.9K41

什么?CC++面试过不了?因为你还没看过这个!

另外还可以定义与 struct Student 冲突 void Student() {}。 C++ 中 由于编译器定位符号规则(搜索规则)改变,导致不同于C语言。...Polymorphism,编译期):模板、函数模板 强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换 静态多态(编译期/早绑定) 函数重载 class...static_cast 用于非多态类型转换 执行运行时类型检查(转换安全性不如 dynamic_cast) 通常用于转换数值数据类型(如 float -> int) 可以在整个层次结构中移动指针...,子类转化为父安全(向上转换),父转化为子类不安全(因为子类可能有不在父字段或方法) dynamic_cast 用于多态类型转换 执行行运行时类型检查 只适用于指针或引用 对不明确指针转换将失败...(RTTI) dynamic_cast 用于多态类型转换 typeid typeid 运算符允许在运行时确定对象类型 type_id 返回一个 type_info 对象引用 如果想通过指针获得派生类数据类型

3.6K50

继承

派生类之间关系: 派生类对象可以使用(公有的)方法。 指针可以在不进行显示类型转换情况下指向派生类对象,但只能调用方法。...引用可以在不进行显示类型转换情况先引用派生类对象,但只能调用方法。 2....实现多态公有继承方法: 在派生类中重新定义方法。 使用虚方法(虚函数)。 3. 静态联编和动态联编 函数名联编:编译器将源代码中函数调用解释为执行特定函数代码称为函数名联编。...将派生类引用或指针转换引用或指针称为向上强制转换,该转换使得公有继承不需要进行显示类型转换。...且该转换是可以传递,例如A,其派生类AP,AP派生类APP,则A指针或引用可以指向或引用AP对象和APP对象。 相反,我们将指针或引用转换派生类指针或引用称为向下强制转换

68620

硬核 | C++ 基础大全

**类型转换:**C++ 中有数据类型隐含转换机制,Java 中需要限时强制类型转换。...这里区分 A a1, A a2; a1 = a2;//调用赋值运算符 A a3 = a1;//调用拷贝构造函数,因为进行是初始化工作,a3 并未存在 简述C++ 四种强制转换 C++ 四种强制转换包括...,上行转换派生类->)安全,下行转换->派生类) 不安全,所以主要执行多态转换操作; dynamic_cast:专门用于派生类之间转换,type-id 必须是指针,引用或 void...多态实现 多态其实一般就是指继承加虚函数实现多态,对于重载来说,实际基于原理是,编译器为函数生成符号表时不同规则,重载只是一种语言特性,与多态无关,与面向对象也无关,但这又是 C++中增加规则...也就是说构造派生类部分是,编译器会认为这就是一个类型对象,然后调用类型虚函数实现,并没有按照我们想要方式进行。即对象在派生类构造函数执行前并不会成为一个派生类对象。

1.2K10

C++强制类型转换

大家好,又见面了,我是全栈君   C++强制类型转换虽然兼容C语言中强制类型转换,但是建议C++中使用C语言风格强制类型转换。...C++强制类型转换共有4种:static_cast,dynamic_cast、const_cast、reinterpret_cast. static_cast 1....:将派生类指针或引用转化为指针或引用 dynamic_cast   (1)执行派生类指针或引用与指针或引用之间转换。   ...(2)使用多态场景,增加了一层对真实调用对象类型检查,可以实现向上转型和向下转型,前提是必须使用public或protected继承   (3)dynamic_cast不是强制转换,而是带有某种”咨询...&c)); //前两个输出值是相同,最后一个则会在原基础偏移4个字节,这是因为static_cast计算了父子类指针转换偏移量,\ 并将之转换到正确地址(c里面有m_a,m_b

1.3K10

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

C++虚函数,抽象,动态绑定和多态构成了出色动态特性。  虚函数  如果一个一个函数被声明为虚函数,那么其派生类对应函数也自动成为虚函数,这样一级级传递下去。...,最后改写为指针运算 派生类定义中名字(对象或函数名)将义无反顾地遮蔽(隐藏)中任何同名对象或函数  函数原型完全相同,当返回类型不同时称为协变  运行时多态  当许多派生类因为继承了共同而建立...  经过隐含转型操作,令一个public多态指针或者引用指向它一个派生类对象。...增加了继承和虚函数对象模型变得更加复杂,规则如下:  为每一个多态创建一个虚函数指针数组vtable,该类所有虚函数(继承自或者新增地址都保存在这张表中。...如果已经插入了vfptr,则派生类将继承和重用该vfptr如果派生类多个继承或者有多个继承分支,而其中若干个继承分支出现了多态,则派生类将从这些分支中每个分支继承一个vfptr,编译器也将为它生成多个

1K20

浅谈C++多态

这是一个用子类指针去指向一个强制转换为子类地址对象。结果,这两句调用输出结果是3,2。   ...而ptr->fun()调用,可能还是由于C++多态原因,由于指向是一个对象,通过虚函数列表引用,找到了中fun()函数地址,因此调用了函数。...这里“隐藏”是指派生类函数屏蔽了与其同名函数,规则例如以下: (1)假设派生类函数与函数同名,可是參数不同。...C++纯虚函数 一、定义 纯虚函数是在中声明虚函数,它在中未定义,但要求不论什么派生类都要定义自己实现方法。...C++支持两种多态性:编译时多态性,执行多态性。 a、编译时多态性:通过重载函数实现 b、执行多态性:通过虚函数实现。

36410

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

九、虚函数是怎么实现: 每一个含有虚函数都至少有有一个与之对应虚函数表,其中存放着该类所有虚函数对应函数指针(地址);示例对象包含虚函数表,只有虚指针;派生类会生成一个兼容虚函数表...A e1=getA2(); //调用拷贝构造函数 return 0; } 十八、 C++四种强制转换类型转化机制可以分为隐式类型转换和显示类型转化...(强制类型转换) (new-type) expression new-type (expression) 隐式类型转换比较常见,在混合类型表达式中经常发生;四种强制类型转换操作符: static_cast...) 该运算符把expression转换成type-id类型,在编译时使用类型信息执行转换,在转换执行必要检测(指针越界、类型检查),其操作数相对是安全 2)dynamic_cast:运行时检查...用于在集成体系中进行安全向下转换downcast,即指针/引用->派生类指针/引用 dynamic_cast是4个转换中唯一RTTI操作符,提供运行时类型检查。

1.2K31

c++】全面理解C++多态:虚函数表深度剖析与实践应用

: 协变(派生类虚函数返回值类型不同): 派生类重写虚函数时,与虚函数返回值类型不同。...这意味着只有析构代码会被执行,而派生类析构逻辑不会调用,可能导致资源泄露或其他问题。...,派生类虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,建议这样使用 1.3 C++11 override...// 显式调用Base中被隐藏func(int) obj.func(3.14); // 调用Derivedfunc(double) 两个派生类同名函数,构成重写就是隐藏 2.多态原理...由于在C++中,一个包含虚函数对象在内存起始地址处通常存储着指向虚表指针,因此这步操作实际获取是指向 Derive 虚表指针 (VFPTR*) 将 int 类型强制转换为 VFPTR* 类型

14500

C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

可用强制类型转换将不同类型数据进行转换。...若虚由非虚派生而来,则仍然先调用构造函数,再调用派生类构造函数。 ~ 5.6 赋值兼容规则 在一定条件下,不同类型数据之间可以进行类型转换,如可以将整型数据赋值给双精度型变量。...下面对虚函数定义做几点说明: 由于虚函数使用基础是赋值兼容规则,而赋值兼容规则成立前提条件是派生类公有派生。因此,通过定义虚函数来使用多态性机制时,派生类必须公有派生。...,而执行派生类析构函数。...因此,抽象只能作为其他来使用,不能建立抽象对象。 不允许具体派生出抽象。所谓具体,就是包含纯虚函数普通。 抽象不能用作函数参数类型、函数返回类型或是显式转换类型

3.1K40

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

是唯一能做到这一点新式转型符 dynamic_cast: 安全下转型(动态转型). 是运行时类型识别(RTTI)一大工具, 可以将引用, 指针, 右值引用转到派生类....相当于传统强制类型转换, 是最常用转换. 只要目标类型包含const, 就都可以用这个转换, 例如从void*中恢复原来类型. 这个转换不会经过运行时检测, 所以使用时候要小心....: 接口与默认实现, 也就是内=0但外单独实现纯虚函数, 允许派生类按照Base::interface来使用提供默认实现 非虚函数: 接口与强制实现, 希望派生类对这个接口进行改变 35...deque, 只是依据在deque而已) 39 明智而审慎地使用private继承 由于访问限制原因, 编译器无法自动将private继承派生类转型为, 且派生类无法使用成员 因此private...只有一种例外, 不允许在成员初值列和列中使用typename 部分编译器接受没有typename代码编译, 但这是规范, 我们还是应该手动写好 43 学习处理模板化名称 编译器无法知道模板实际继承了模板什么内容

88830

60秒问答:多态和函数重载关系?

编译时多态:函数重载和运算符重载(根据参数不同选择具体函数 ) 运行时多态:通过继承和虚函数实现(根据虚表指针 指向 派生类函数,还是函数) 四、 类型转换有几种情况,有什么区别?...答: 自动类型转换,缺点有可能丢失精度(派生类转换base,3.14--3) 静态转换 动态转换 强制转换 和解释转换 3、 区别:静态转换 任何类型 ---- 解释 到底什么是多态?...编译器会当前域开始查找(比如派生类对象调用,会在派生类定义内查找),查找需要名字; 2. 如果在当前域没有找到,编译器会在外围作用域继续查找,先是定义内,然后是全局名字空间; 3....编译时多态:函数重载和运算符重载(根据参数不同选择具体函数 ) 运行时多态:通过继承和虚函数实现(根据虚表指针 指向 派生类函数,还是函数) 四、 类型转换有几种情况,有什么区别?...答: 自动类型转换,缺点有可能丢失精度(派生类转换base,3.14--3) 静态转换 动态转换 强制转换 和解释转换 3、 区别:转换类型 ,释放必须虚函数 ,安全与效率。

1.3K10

c++面试选择题_C语言经典笔试题

定义一个对象时先调用构造函数、然后调用派生类构造函数;析构时候恰好相反:先调用派生类析构函数、然后调用析构函数。...C++多态性具体体现在运行和编译两个方面: 在程序运行时多态性通过继承和虚函数来体现; 在程序编译时多态性体现在函数和运算符重载; 虚函数:在中冠以关键字 virtual 成员函数。...具有纯虚函数是抽象(abstract class),不能声明对象,只能作为派生类服务,除非派生类完全实现了所有纯虚函数,否则派生类也成为抽象,不能声明对象。...继承来纯虚函数,在派生类中仍是虚函数。 抽象中不仅包括纯虚函数,也可包括虚函数。抽象必须用作派生其他,而不能用于直接创建对象实例。但仍可使用指向抽象指针支持运行时多态性。...两个不同类型指针之间可以强制转换(用reinterpret cast)。C#是类型安全。 16. main 函数执行以前,还会执行什么代码? 答案:全局对象构造函数会在main 函数之前执行

1.1K10

c#中多态学习总结

c#多台方法,大体c++类似,但是有点区别的,我这里刚刚初学,因此把重点记录下。 多态是同一个行为具有多个不同表现形式或形态能力。 多态性意味着有多重形式。...在C#中,每个类型都是多态,因为包括用户定义类型在内所有类型都继承自Object。...记得在侯捷视频中,大师提到过,函数名是一样,但是编译器其实已经做了标记,在底层函数名称是不一样。 函数重载和c++类似,这里细谈了。总之一点就通过函数参数来重载。...虚方法实例如下: #define OV //宏定义一定要放在using前面 /*如果注释掉上面的宏定义,那么程序输出结果是: 执行画图任务 执行画图任务 执行画图任务...* 说白了,子类调用Draw()使用是调用了Draw().并没有实现多态功能 如果使用上面的宏定义 输出是 画一个长方形 执行画图任务 画一个三角形 执行画图任务 画一个圆形

79520

CC++面试题之语言基础篇(一)

继承中三个修饰符: public:公有继承,派生类继承公有成员,这些成员在派生类中仍然是公有的。...protected:保护继承,派生类继承保护成员,这些成员在派生类中变为保护或私有的。...private:私有继承,派生类继承私有成员,这些成员在派生类中变为私有的,不能被外部访问。 C语言和C++区别 与C语言区别: C语言是面对过程,而C++是面对对象。...C语言中结构成员是默认是公共,而在C++中没有加限定符则默认是私有的 C++中有bool类型,而C语言可没有bool类型 定义常量C语言使用#define,而C++使用const 在C中,强制类型转换通常例如...简述C++代码执行二进制文件.exe过程 有四个过程,预编译、编译、汇编、链接 C++函数只声明,不定义会在哪步报错 实际错误通常发生在链接阶段,当链接器尝试将所有编译单元(源文件)组合在一起时

19110

C++】三大特性之多态

派生类虚函数在不加  virtual 关键字时,虽然也可以构成重写 ( 因为继承后虚函数被继承下来了在派生类依旧保持虚函数属性), 但是该种写法不是很规范,建议这样使用 虚函数重写两个例外...协变(派生类虚函数返回值类型不同) 派生类重写虚函数时,与虚函数返回值类型不同。即虚函数返回对象指 针或者引用,派生类虚函数返回派生类对象指针或者引用时,称为协变。...总结一下派生类虚表生成: a.先将虚表内容拷贝一份派生类虚表中 b.如果派生类重写了中某个虚函数,用派生类自己虚函数覆盖虚表中虚函数 c.派生类自己新增加虚函数按其在派生类声明次序增加到派生类虚表最后...我们强制类型转换成 int* 就是为了取到四个字节,但是在32位下是4字节,在64位下是8字节只有指针了,所以我们强制类型转换为二级指针就行了。这样解引用时候,得到一级指针就是占用8字节了。...菱形继承、菱形虚拟继承 实际中我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样 模型,访问成员有一定得性能损耗。

70950

《逆袭进大厂》之C++篇49问49答(绝对干货)

所以将析构函数声明为虚函数是十分必要。在实现多态时,当用操作派生类,在析构时防止只析构析构派生类状况发生,要将析构函数声明为虚函数。...A中fun函数 return 0; } 36、C++多态如何实现 C++多态性,一言以蔽之就是: 在函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象实际类型来调用相应函数...子类1继承并重写了函数,子类2继承但没有重写函数,结果分析子类体现了多态性,那么为什么会出现多态性,其底层原理是什么?这里需要引出虚表和虚表指针概念。...派生类成员访问形象有如下两种: 内部访问:由派生类中新增成员函数对继承来成员访问 外部访问:在派生类外部,通过派生类对象对继承来成员访问 (二)继承权限 public继承...(或引用)派生类引用强制类型转换时,如果转换是不安全,则会拋出此异常 bad_alloc:在用 new 运算符进行动态内存分配时,如果没有足够内存,则会引发此异常 out_of_range:用

2.5K40

全面盘点C++类型转换

类型转换是由程序员显式使用强制转换操作符执行。在C++中有四种类型类型转换,即static_cast、dynamic_cast、reinterpret_cast和const_cast。...例如:字符串转整数、指针不同类型之间转换。 如下图所示: 1.隐式转换 当涉及C++隐式类型转换时,这是一种由编译器自动执行过程,无需程序员显式指示。...如果引用对象包含转换类型,则返回空指针(当转换为引用时,在这种情况下会抛出错误转换异常)。...向上强制转换(强制转换)对于static_cast和dynamic_cast总是有效,也可以不进行任何强制转换,因为向上强制转换是隐式转换(假设是可访问,即它是公共继承)。...<< std::endl; } 如果参数类型不是多态,则不能将dynamic_cast强制转换用于向下强制转换(强制转换派生类)。

21810
领券