`

c++ 用“引用”而非“值”去捕获异常

阅读更多

如果抛出一个派生类对象而且该对象被基类的对象处理器通过值捕获到,对象会被“切片”,这就是说,随着向基类对象的传递,派生类元素会依次被割下,直到传递完成。这样的偶然性并不是所要的,因为对象的行为像基类而不象它本来就是的派生类对象(实际就是“切片”以前)。

#include <iostream>
using namespace std;

class base{
public:
  virtual void print(){
  	cout << "base" << endl;
  }
};

class derive: public base{
public:
  virtual void print(){
  	cout << "derive" << endl;
  }
};

void f(){
  throw derive();
}

int main(){
    try{
       f();
		}catch(base b){
			b.print();
    }
    
    try{
    	f();
    }catch(base &b){
    	b.print();
    }
	return 0;
}

 输出:

 base

 derive

 

当对象通过值被捕获时,因为它被转化成一个b a s e对象(由构造函数完成),而且在所有的情
况下表现出b a s e对象的行为;然而当对象通过引用被捕获时,仅仅地址被传递而对象不会被切
片,所以它的行为反映了它处于派生中的真实情况。

0
0
分享到:
评论

相关推荐

    C++异常处理的编程方法

    按值传递会在捕获异常时创建异常对象的副本,按引用传递则直接引用原始对象,而按指针传递则是传递异常对象的内存地址。这三种方式各有优势,按值传递简单但效率低,按引用传递效率高但需要正确管理引用,按指针传递...

    C++ C#混合编程

    例如,C#中的值类型(如int)在传递给C++时可能需要封装为.NET的结构体,而C++的指针在C#中则通常表示为委托或类型引用来处理。 5. **DLL导出和导入**:当C++库需要被C#调用时,需要使用`__declspec(dllexport)`或`...

    C++ CLI标准说明.rar

    7. **异常处理**:C++ CLI遵循.NET的异常处理模型,使用`try-catch`块捕获和处理异常,而非传统的C++异常。 8. **编译器选项与配置**:在Visual Studio中,开发者可以通过设置项目属性来选择是否生成纯托管代码、...

    C# 调用C++DLL(函数参数包含指针)

    因为非托管代码可能抛出未处理的异常,我们需要捕获这些异常以确保程序的稳定性。 5. **内存管理**:当C++DLL通过指针返回数据时,需要注意内存管理。C++可能会分配内存,而C#需要负责释放。确保在C#中使用`Marshal...

    C++异常处理技巧try/catch/throw/finally/exception

    - **通过引用捕获异常**:在某些情况下,通过引用而不是值来捕获异常可能是更好的选择,这样可以避免不必要的复制操作。 - **谨慎使用异常规格**:虽然C++支持在函数声明中指定异常规格,但在实际应用中很少使用这一...

    c++内部培训ppt

    6. **异常处理**:C++提供了异常处理机制,允许程序员在出现错误时抛出异常,并在合适的地方捕获并处理异常,提高了程序的健壮性。 7. **命名空间**:命名空间是C++为解决全局名字冲突问题引入的,它将相关的实体...

    C++高手参考手册,绝对物超所值!!!

    5. **异常处理**:讨论C++的错误处理机制,如何抛出和捕获异常,以及良好的异常处理策略。 6. **内存管理**:涵盖动态内存分配、指针操作、智能指针,以及内存泄漏的预防。 7. **多线程**:介绍C++11及后续版本中...

    More Effective C++.pdf

    - **优点**:通过引用捕获异常可以避免不必要的拷贝,提高性能。 - **注意事项**:确保引用的有效性,避免引用无效对象。 ##### 审慎使用异常规格(EXCEPTION SPECIFICATIONS) (Item M14) - **功能**:异常规格允许...

    Microsoft Visual C++ 使用指南

    8. **异常处理**:C++支持异常处理机制,允许程序在运行时捕获和处理错误。Visual C++的IDE提供了对异常处理的友好支持。 9. **资源编辑器**:在Visual C++中,可以使用资源编辑器创建和修改应用程序的资源,如...

    C++ API帮助手册

    5. C++11及更高版本的新特性:C++11引入了lambda表达式、右值引用、类型推断(auto关键字)等新特性,提升了代码的简洁性和可读性。 四、C++ API的扩展和自定义 除了标准库之外,C++ API还可以通过库的API来扩展,...

    c++

    9. **C++11及更高版本的新特性**:如lambda表达式、右值引用、auto关键字、move语义等。 通过深入学习和实践,你可以逐渐精通C++,并能够利用它的强大功能来解决各种复杂问题。记住,理解和运用C++的关键在于不断地...

    More Effective C++pdf版

    - ITEM M2提倡使用C++风格的类型转换(如`static_cast`, `dynamic_cast`, `reinterpret_cast`, `const_cast`),而非C风格的隐式类型转换,以提高代码的清晰度和安全性。 - ITEM M3指出数组不支持多态性,因此在...

    C++/CLI 语言规范英文版本

    8. **异常处理**:C++/CLI支持.NET的异常处理模型,使用`try-catch`块来捕获和处理异常。 9. **互操作性(Interop)**:C++/CLI提供强大的互操作性能力,可以调用非托管的DLL函数,也可以与.NET Framework中的其他...

    C++ Lambda表达式详解

    捕获方式有三种,分别是值捕获、引用捕获和混合捕获。 值捕获:将外部变量以const引用的方式传递到Lambda表达式中,在表达式中可以访问变量,但是不能修改变量;使用=可以将函数作用域的所有变量以值捕获方式传入到...

    c++经典代码大全 清晰版

    - 异常的基本概念:理解何时何地抛出和捕获异常。 - `try-catch`语句:学习如何编写异常安全的代码。 9. **STL(标准模板库)** - 容器(如vector、list、set、map等):掌握各种容器的使用和操作。 - 迭代器:...

    非c程序员c++教程

    8. **异常处理**:C++的错误处理机制,通过try-catch块来捕获和处理运行时错误。 9. **输入/输出流**:iostream库的使用,包括cin和cout进行标准输入输出,以及fstream库进行文件操作。 10. **标准库和STL**:介绍...

    C与C++差异

    - C++引入了更简洁的单行注释方式,即使用`//`开始一行作为注释,而C语言则使用`/*...*/`来包围多行注释。这意味着在C++中,你可以快速地添加单行注释,提高了代码的可读性。 2. **变量域运算符**: - C++引入了`...

Global site tag (gtag.js) - Google Analytics