大佬教程收集整理的这篇文章主要介绍了C:对象切片和异常,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
但是现在我正在尝试进行实验,但是在按值捕获时我找不到切片的示例.切片的常规场景(不是例外)是这样的:
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时的切片示例吗?
从http://en.cppreference.com/w/cpp/language/throw开始:
注意,如果你替换throw;通过throw x ;,将抛出一个Base实例并且不会捕获,导致调用std :: abort().实际上,切片的衍生物不能被未切割(这就是为什么我们通常不喜欢切片,除非它们是披萨切片)被catch(Derived)捕获.
作为结论,我坚持“按价值投掷,按(常)引用”).在这个具体的例子中,你很好地捕捉切片值,但一般情况并非如此. Serge Ballesta’s answer提供了一个导致麻烦的价值追赶的例子.快速搜索您最喜爱的搜索引擎可以帮助您找到其他案例,其中捕获价值正在寻找麻烦.
以上是大佬教程为你收集整理的C:对象切片和异常全部内容,希望文章能够帮你解决C:对象切片和异常所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。