加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C抛出引用指针

发布时间:2020-12-16 03:07:46 所属栏目:百科 来源:网络整理
导读:以下抛出的异常对象的类型是什么? 问题1 range_error r(“error”);扔r ANSWER1 range_error的对象 问题2异常* p = r;扔* p; ANSWER2一个例外的切片对象 问题3异常* p = r;抛出 ANSWER3抛出指向range_error的指针.捕获处理可以通过动态绑定访问range_error
以下抛出的异常对象的类型是什么?

问题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 *)块.答案是正确的,但是我会指定指针的类型,就像指针的类型一样. (指针的类型在某种程度上隐含在答案中)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读