C抛出引用指针

前端之家收集整理的这篇文章主要介绍了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 *)块.答案是正确的,但是我会指定指针的类型,就像指针的类型一样. (指针的类型在某种程度上隐含在答案中)

原文链接:https://www.f2er.com/c/112458.html

猜你在找的C&C++相关文章