在c++中,如果基类构造函数异常,则构造函数和析构函数的顺序可以是这样

In C++,if the Base class constructor exception,then the sequence of constructor and destructor could be this?

本文关键字:构造函数 顺序 析构函数 c++ 如果 基类 异常      更新时间:2023-10-16
#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");
}