C抛出引用指针

以下抛出的异常对象的类型是什么?

问题1> range_error r(“error”);扔r

ANSWER1> range_error的对象

问题2>异常* p =& r;扔* p;

ANSWER2>一个例外的切片对象

问题3>异常* p =& r;抛出

ANSWER3>抛出指向range_error的指针.捕获处理可以通过动态绑定访问range_error成员函数.

我得到这些问题吗?

//更新并编译并在VS2010上运行

#include <iostream>
using namespace std;

class ExClassA
{
public:
    virtual void PrintMe() const
    {
        cout << "ExClassA" << endl;
    }
};

class ExClassB : public ExClassA
{
public:
    virtual void PrintMe() const
    {
        cout << "ExClassB" << endl;
    }
};

int main(int argc,char* argv[])
{   
    ExClassB exClassB;
    ExClassA *p = &exClassB;

    try
    {
        throw *p;
    }
    catch (const ExClassA& e)
    {
        e.PrintMe();        
    }

    try
    {
        throw p;
    }
    catch (const ExClassA* e)
    {
        e->PrintMe();
    }
}

上述程序的第一个try-catch打印“ExClassA”

上述程序的第二个try-catch打印“ExClassB”

解决方法

我认为你们三个都是对的.被抛出的对象(IIRC)的类型是被抛出的对象的静态类型.我必须深入标准一段时间才能找到确切的引号,但是一个简单的例子似乎证实了这一点:
struct base {};
struct derived : base {};
void t() {
    derived d;
    base * b = &d;
    throw *b;
}
int main() {
    try {
        t();
    } catch ( derived const & ) {
        std::cout << "derived" << std::endl;
    } catch ( base const & ) {
        std::cout << "base" << std::endl;
    }
}

如果使用被抛出的对象的动态类型,则* b将具有派生类型,第一个catch将成功,但从经验上讲第二个catch被执行(g).

在最后一种情况下,抛出的对象是指向一个range_error对象的异常的指针.稍微的区别又是可以被捕获的,编译器不会捕获catch(range_error *)块.答案是正确的,但是我会指定指针的类型,就像指针的类型一样. (指针的类型在某种程度上隐含在答案中)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...