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

覆盖虚函数时的异常规范?

覆盖虚函数时的异常规范是指在派生类中重写(覆盖)基类的虚函数时,对异常的处理规范。在C++中,虚函数可以通过在函数声明中使用throw关键字来指定可能抛出的异常类型,这被称为异常规范。

异常规范的目的是为了提供编译时的静态类型检查,以确保在派生类中覆盖虚函数时,异常的处理方式与基类一致。异常规范可以有以下几种形式:

  1. 不带异常规范:如果派生类中的虚函数不带异常规范,表示该函数可以抛出任何类型的异常,与基类的异常规范不一致。这种情况下,派生类的异常规范会覆盖基类的异常规范。
  2. 带有空异常规范:使用throw()表示派生类中的虚函数不会抛出任何异常,与基类的异常规范不一致时,会导致编译错误。
  3. 带有具体异常规范:使用throw(Type1, Type2, ...)表示派生类中的虚函数只能抛出指定的异常类型,与基类的异常规范不一致时,会导致编译错误。

在覆盖虚函数时,通常建议遵循以下几点:

  1. 异常规范应该与基类保持一致,以确保在多态调用时的异常处理一致性。
  2. 如果派生类中的虚函数不会抛出异常,可以使用空异常规范throw()来明确表示。
  3. 如果派生类中的虚函数可能抛出异常,应该根据实际情况选择合适的异常规范,以提供更精确的异常信息。

需要注意的是,异常规范在C++11标准中已经被废弃,因为它们在实际应用中的效果有限。现代C++更倾向于使用异常处理机制来处理异常,而不是依赖于异常规范。

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

暂无相关产品和链接地址。

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

相关·内容

C++函数与纯函数

C++函数是一种特殊成员函数,用于实现多态性。函数允许在基类中声明一个函数,在派生类中根据需要进行重写,并通过基类指针或引用来调用派生类对象特定实现。...①函数声明 在基类中,我们可以使用关键字virtual来声明一个函数。...ptr->show(); ③派生类重写函数 派生类可以重写基类中函数,以提供自己实现。...." << endl; } }; ④纯函数 函数也可以被声明为纯函数,即没有默认实现函数。纯函数通过在声明中使用= 0来标识。...函数使用动态绑定,即运行时将根据对象实际类型选择正确函数实现。 构造函数不能是函数。 静态成员函数不能是函数函数可以被继承,派生类可以选择是否重写函数

20410
  • C++继承、函数、RTTI、友元类、异常处理

    当使用protected继承,父类所有public成员在当前子类中会变为protected。==。 函数 c++中,被定义为函数成员,能被子类重写,函数是用virtual修饰函数。...因为引用类型是父类型,在调用普通方法,仍是父类方法,只有调用方法,使用了真正子类方法。而指针类型也是与引用类型类似。 析构函数与继承 c++中子类析构函数结束会自动调用父类析构函数。...),可以则传递该对象地址/转化后引用,否则返回空指针(对于引用类型则是抛出异常) ,要向下转化要求传入参数类型对应类中需要有函数,否则编译出错,因为方法表里包含了类型信息type_info,向下转型需要使用...其中有what()函数,返回一个const char *,一般通过重写该方法表示异常信息。...,编译器会认为是覆盖,将对子类隐藏父类同名方法,为了加强对这种情况检查,可以通过在子类方法后面加上override关键字,代表是重写父类方法而不是覆盖,此时如果形参类型不一致,会导致编译失败。

    77110

    c++ 继承类强制转换函数表工作原理

    本文通过简单例子说明子类之间发生强制转换函数如何调用,旨在对c++继承中函数作用机制有更深入理解。...因为在类child2函数表中,共存在三个函数,分别为f() b() a(),其中函数b()是第二个,因此编译器就会把对象c1对应内存来当做类child2内存布局来解析(注意内存里内容不变,还是...c1,即为类child1内存布局,在这里只有函数表),此时在类child1函数表中也找第二个函数,找到了函数a(),因此输出“child1::a()”,运行正常。...但这种行为可能是危险,若使用内存布局并不适合真实内存,很可能造成访问越界等问题(如上例中“pc21->a();”,这次就在类B函数表中找第三个函数,结果没有找到(访问越界),函数运行时崩溃。)...2、通过上述例子可知,函数函数表中存储顺序是与声明顺序一致,而不是函数名字字符串排序,如本例中为f() b() a(),虽然编程自动补全提示框中显示顺序是a() b() f(),但可能已经经过内部优化

    1.1K30

    关于函数学习思考

    为什么需要函数?为是实现类多态特性,能够使同一个方法在派生类与基类产生不同行为。...函数工作原理是为对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组指针,这种数组成为函数表(virtual function table, vtbl)。...在调用函数,程序将查看存储在对象中vtbl地址,然后转向相应函数地址表。这也暗示了使用函数,会带来一定程序内存和时间开销。...虽然非虚函数效率比函数高,但是非虚函数不具备动态联编功能。 什么是动态联编?首先了解一下函数名联编。函数名联编是指将函数调用解释为执行特定函数代码块。在编译过程中进行联编成为静态联编。...然而很可能在执行阶段,我们才确定需要使用哪一个函数,因此我们需要动态联编,即指编译器生成在程序运行阶段执行正确函数代码行为。 ​

    19620

    【c++】多态&&函数&&抽象类&&继承中函数表详解

    (覆盖):派生类中有一个跟基类完全相同函数(即派生类函数与基类函数返回值类型、函数名字、参数列表完全相同),称子类函数重写了基类函数 class Person { public: virtual...,派生类函数在不加virtual关键字,虽然也可以构成重写(因 为继承后基类函数被继承下来了在派生类依旧保持函数属性),但是该种写法不是很规范,不建议 这样使用*/ /*void BuyTicket...::Func1,所以函数重写也叫作覆盖覆盖就是指表中函数覆盖。...重写是语法叫法,覆盖是原理层叫法 另外Func2继承下来后是函数,所以放进了表,Func3也继承下来了,但是不是函数,所以不会放进函数表本质是一个存函数指针指针数组,一般情况这个数组最后面放了一个...nullptr 总结一下派生类表生成:a.先将基类中表内容拷贝一份到派生类表中 b.如果派生类重写了基类中某个函数,用派生类自己函数覆盖表中基类函数 c.派生类自己新增加函数按其在派生类中声明次序增加到派生类最后

    35010

    【C++】多态 ⑧ ( 验证指向 函数 vptr 指针 | 对比定义了函数类和没有定义函数大小 )

    对比 定义了 函数 类 与 没有定义函数大小 , 其它成员都相同 , 定义了函数类多出了 4 字节 , 多出 4 字节就是 vptr 指针占用内存空间 ; 一、验证指向 函数表...存储到 " 函数表 " 中 ; 函数表 创建 : 在 类 中使用 virtual 关键字 声明 函数 , C++ 编译器 会自动为该类生成 " 函数表 " ; 生成函数前提是 至少有...中 , 重写了 父类 virtual 函数 , 那么 C++ 编译器会在 子类 函数表 中放入该 子类函数 函数指针 ; 如果 C++ 类中存在 virtual 函数 , 在创建对象 ,...会生成 函数表 Virtual Function Table , 简称 vtable ; C++ 编译器 编译 代码 , 会自动为该类 添加 一个 vptr 指针 成员变量 , 该指针 会指向 函数表...main() { Parent* p; // 创建 Child 子类对象 // 发现有 virtual 函数 会创建 函数表 // 在对象中使用 vptr 指针指向 函数表 首地址

    20240

    多态中析构函数

    为什么析构函数要声明成virtual呢? 因为,如果delete一个基类指针, 如果它指向是一个子类对象,那么析构函数不为就会导致无法调用子类析构函数,从而导致资源泄露。...在这里,因为~Animal()是virtual,尽管是通过Animal类型指针调用,根据表v-table信息,~Dog()被正确调用到。...去掉析构函数virtual属性后,因为该类中没有其他virtual函数,所以编译不会生成v-table,这样就节省了编译时间,并减少了最终生成程序大小。...同样,当作一个抽象,如果你模仿Javainterface,声明了如下基类: class AbstractBase { virtual method1() = 0; virtual...这是因为,COM通过使用引用计数机制来维护对象。当你使用完一个COM对象,调用Release(),COM内部实现检查引用技术是否为零。

    76860

    函数性能真的那么差?

    关于函数 对于函数(virtual function)实现机制,在此就不再赘述了,本节我们聊聊关于函数性能消耗这块。...其次,编译器在包含函数类中添加一个隐含指针vptr指向类函数表,一般情况下,这个vptr指针在对象最前面 最后,在运行时,通过查找函数表,进而找到正确应该被调用函数。...对象 好了,上述这个过程仅仅是本文后续内容一个铺垫,往往,我们说函数性能差,是因为查找过程导致性能较普通函数或者普通成员函数查,嗯,相信很多人和我一样,认为这个差,是很差~~ 性能 直到我昨天在查阅某个问题时候...好了,图来了~~ 从上图可以看出,我们所理解函数性能(准确说是查表)性能,与L3差不多,整数除法操作一半性能。...,慎用多线程,毕竟其上下文切换开销很大•异常处理性能损耗超过我们想象•尽量避免系统/内核调用

    22610

    干货丨C++中函数

    比如:模板技术,RTTI技术,函数技术,要么是试图做到在编译决议,要么试图做到运行时决议。 关于函数使用方法,不做过多阐述。大家可以看看相关C++书籍。...下面,我将分别说明“无覆盖”和“有覆盖函数样子。没有覆盖父类函数是毫无意义。我之所以要讲述没有覆盖情况,主要目的是为了给一个对比。...在比较之下,我们可以更加清楚地知道其内部具体实现。 一般继承(无函数覆盖) 下面,再让我们来看看继承函数表是什么样。假设有如下所示一个继承关系: ?...2)父类函数在子类函数前面。 我相信聪明你一定可以参考前面的那个程序,来编写一段程序来验证。 一般继承(有函数覆盖覆盖父类函数是很显然事情,不然,函数就变得毫无意义。...我们从表中可以看到下面几点, 1)覆盖f()函数被放到了表中原来父类函数位置。 2)没有被覆盖函数依旧。

    58641

    团队合作CSS命名规范

    常用css命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper...:tips 栏目标题:title 加入:joinus 指南:guide 服务:service 注册:register 状态:status 投票:vote 合作伙伴:partner 注释写法...: /* Footer / 内容区 / End Footer */ id命名 (1)页面结构 容器: container 页头:header 内容:content/container 页面主体...(1)颜色 使用颜色名称或者16进制代码,如 .red { color: red; } .f60 { color: #f60; } .ff8600 { color: #ff8600; } (2...,如 .barnews { } .barproduct { } 注意事项 1、一律小写; 2、尽量用英文; 3、不加中杠和下划线; 4、尽量不缩写,除非一看就明白单词.

    95410

    函数表”推演及多态原理

    本文将介绍函数相关内容,阐述了它与多态之间难以割舍关系。...,并通过间接手段调用了一次函数表里面的函数。...func(){ cout << “class B func” << endl; } }; 此时,我们生成一个类 B 对象,当这个对象构造完毕,我们再次调试查看它继承类 A 中函数表中内容...很明显我们发现,继承下来类 A 中函数表第一个函数变成了 B::func,实际上,这个操作只是将函数表中函数指针进行了覆盖。这种方式我们就称为覆写。当你使用子类对象初始化一个父类指针。...这个指针在调用 func 函数,会优先遍历函数表,如果发现同名函数,则调用之。如果没有发现再到非虚函数表以外成员方法中寻找。

    14830

    构造函数为什么一般不定义为函数?而析构函数一般写成函数原因 ?

    浏览量 3 1、构造函数不能声明为函数 1)因为创建一个对象需要确定对象类型,而函数是在运行时确定其类型。...而在构造一个对象,由于对象还未创建成功,编译器无法知道对象实际类型,是类本身还是类派生类等等 2)函数调用需要函数表指针,而该指针存放在对象内存空间中;若构造函数声明为函数,那么由于对象还未创建...,还没有内存空间,更没有函数表地址用来调用函数即构造函数了 2、析构函数最好声明为函数,首先析构函数可以为函数,当析构一个指向派生类基类指针,最好将基类析构函数声明为函数,否则可以存在内存泄露问题...如果析构函数不被声明成函数,则编译器实施静态绑定,在删除指向派生类基类指针,只会调用基类析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。子类析构,要调用父类析构函数吗?...析构函数调用次序时先派生类后基类。和构造函数执行顺序相反。并且析构函数要是virtual,否则如果用父类指针指向子类对象时候,析构函数静态绑定,不会调用子类析构。

    62310
    领券