在c++中,如果基类构造函数异常,则构造函数和析构函数的顺序可以是这样
In C++,if the Base class constructor exception,then the sequence of constructor and destructor could be this?
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base"<<endl;
}
~Base()
{
cout << "~Base"<<endl;
}
};
class Child: public Base
{
public:
Child()
{
cout << "Child"<<endl;
}
~Child()
{
cout << "~Child"<<endl;
}
};
int main()
{
try
{
Child cc;
}
catch(...)
{
}
return 0;
}
一般输出将是
Base
Child
~Child
~Base
但是,如果Base是构造函数时发生了可怕的事情或异常,则是序列可能是:
Base
~Base
Child
~Child
谁能写一个演示来说明这一点?c++通常不会在构造函数中抛出异常,但是如果发生了,那么它会导致那样的输出吗?
谢谢你的帮助。我不确定在通常的代码中,这可能会发生。是否有可能在复杂的基础构造函数或错误的东西或什么,这将改变通常的输出?如果有,谁能给我举个例子?
如果在Base
类构造函数中发生异常,则不调用析构函数。
因为没有一个完整的对象需要被销毁!
忍不住引用Herb的话:
"它不会死,因为它从来没有活过!"
include <stdexcept>
Base()
{
cout << "Base"<<endl;
throw std::runtime_error("error");
}
相关文章:
- 类内初始化与构造函数初始化列表的顺序
- 运算符 new 的执行顺序和构造函数的参数
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 用作成员构造函数参数的函数的求值顺序
- 函数中调用的构造函数的顺序
- 构造函数中初始化列表的计算顺序是否固定?
- 构造函数和析构函数的顺序
- 遵循 C++ 中的构造函数执行顺序
- 更改操作的构造函数顺序
- 构造函数的初始值设定项列表中的函数调用是否按顺序排序?
- 如何维护类成员的顺序,并且仍然有一个可工作的构造函数
- 在继承中更改构造函数的顺序
- C++:初始值设定项列表顺序中的构造函数
- 如何在使用 std::make_tuple 时避免构造函数的未定义执行顺序
- 程序不会按照构造函数进行顺序进行,从而导致非初始化的变量
- 构造函数的调用顺序
- 构造函数和析构函数调用的顺序
- C++构造函数顺序
- 虚拟继承构造函数顺序