порядок C'Tors / D'Tors в наследовании и исключении - PullRequest
0 голосов
/ 04 июля 2019

ссылка на скриншот кода: https://imgur.com/AK0CCgl

Я не понимаю, почему класс Dtor of Base активируется 3 раза, и Dtor класса Derived активируются 2 раза вместо 1 раз для Base и для Derived?

#include <iostream>
class Base
{
   public:
          Base()
          {
                 cout<<"Base Ctor!\n";
          }
          ~Base()
          {
                 cout<<"Base Dtor!\n";
          }
};
class Derived : public Base
{
 public:
        Derived()
        {
                 cout<<"Derived Ctor!\n";
        }
       ~Derived()
        {
                 cout<<"Derived Dtor!\n";
        }
};

int main()
{
            Derived d;
            try
            {
             throw d;
            }
            catch (Base b)
            {
             cout<<"Caught Base Exception!\n";
            }
            catch (Derived d)
            {
             cout<<"Caught Derived Exception!\n";
            }
            return 0;
 }

Выход:

Base Ctor!
Derived Ctor!
Caught Base Exception!
Base Dtor!
Derived Dtor!
Base Dtor!
Derived Dtor!
Base Dtor!

1 Ответ

0 голосов
/ 04 июля 2019

Бросая и ловя, делает несколько копий-вызовов. Читать немного информации .

Чтобы посмотреть, как это работает, я добавил в ваш код:

#include <iostream>
using namespace std;
class Base
 {
   public:
          Base()
                {
                 cout<<"Base Ctor!\n";
                }
          ~Base()
                {
                 cout<<"Base Dtor!\n";
                }
          Base(Base& other)
                {
                 cout<<"Base Copy Ctor!\n";
                }
};
class Derived : public Base
{
 public:
        Derived()
                {
                 cout<<"Derived Ctor!\n";
                }
       ~Derived()
                {
                 cout<<"Derived Dtor!\n";
                }
       Derived(Derived& other)
                {
                 cout<<"Derived Copy Ctor!\n";
                }
};

int main()
          {
            Derived d;
            try
            {
             cout << "Before throwing d\n";
             throw d;
             cout << "After throwing d\n";
            }

            catch (Base b)
            {
             cout<<"Caught Base Exception!\n";
            }
            catch (Derived d)
            {
             cout<<"Caught Derived Exception!\n";
            }
       return 0;
 }

Вы можете увидеть это в действии здесь . К настоящему времени игнорируйте предупреждения о неиспользованных переменных. Другие предупреждения полезны, так как они предлагают вызывать базовый copy-ctor из производного copy-ctor. Измените код и немного поиграйте с ним.

Выводит:

Base Ctor!
Derived Ctor!
Before throwing d
Base Ctor!
Derived Copy Ctor!
Base Copy Ctor!
Caught Base Exception!
Base Dtor!
Derived Dtor!
Base Dtor!
Derived Dtor!
Base Dtor!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...