C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C:对象切片和异常大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在一次采访中,我被问到为什么按价值捕获异常可能是一个问题,我回答说这会导致对象切片.这就是我在互联网上找到的,例如: https://www.viva64.com/en/w/v746/

但是现在我正在尝试进行实验,但是在按值捕获时我找不到切片的示例.切片的常规场景(不是例外)是这样的

Derived d1;
Derived d2;
Base& b1 = d1;
Base& b2 = d2;
b1 = b2;

在最后一行中调用Base的赋值运算符,它只复制Derived对象的Base部分.因此,b1的基础部分是从d2复制的,而b1的派生部分是从d2复制的.坏.

但是,当按价值捕获异常时,这怎么会发生

我尝试了这个代码(同时使用:g和Sun CC编译器):

struct Base
{
    virtual void print() const
    {
        cout << "{ Base: " << m << " }" << endl;
    }

    Base(int _m = 0) : m(_m) {}

    int m;
};

struct Derived : Base
{
    Derived(int _m = 0,int _n = 0) : Base(_m),n(_n) {}

    void print() const
    {
        cout << "{ Base: " << m << ",Derived: " << n << " }" << endl;
    }

    int n;
};

int main()
{
    try
    {
        try
        {
            throw Derived(3,300);
        }
        catch(Base X)
        {
            cout << "Inner catch: ";
            x.print();
            throw;
        }
    }
    catch(Derived y)
    {
        cout << "Outer catch: ";
        y.print();
    }    
}

输出是:

Inner catch: { Base: 3 }
Outer catch: { Base: 3,Derived: 300 }

所以我抛出Derived异常,捕获它的Base BY VALUE并重新抛出,然后捕获Derived BY VALUE并且一切正常,没有任何切片.
那个怎么样?

并且有人可以提供捕获BY VALUE时的切片示例吗?

解决方法

尽管catch(BasE)会对抛出的Derived对象进行切片,但rethrow使用原始异常对象而不是切片副本.

http://en.cppreference.com/w/cpp/language/throw开始:

注意,如果你替换throw;通过throw x ;,将抛出一个Base实例并且不会捕获,导致调用std :: abort().实际上,切片的衍生物不能被未切割(这就是为什么我们通常不喜欢切片,除非它们是披萨切片)被catch(Derived)捕获.

作为结论,我坚持“按价值投掷,按(常)引用”).在这个具体的例子中,你很好地捕捉切片值,但一般情况并非如此. Serge Ballesta’s answer提供了一个导致麻烦的价值追赶的例子.快速搜索您最喜爱的搜索引擎可以帮助您找到其他案例,其中捕获价值正在寻找麻烦.

大佬总结

以上是大佬教程为你收集整理的C:对象切片和异常全部内容,希望文章能够帮你解决C:对象切片和异常所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。