Информация об изменениях

Сообщение Re: Вызов виртуального метода из деструктора от 05.08.2019 13:50

Изменено 05.08.2019 13:51 Carc

Re: Вызов виртуального метода из деструктора
Здравствуйте, Barbar1an, Вы писали:


B>
B>class A
B>{
B>public:
B>    void Normal()
B>    {
B>        Virtual();
B>    }

B>    virtual void Virtual()
B>    {
B>        // это не вызовется  - ОК
B>    }

B>};

B>class B : public A
B>{
B>public:

B>    virtual void Virtual() override
B>    {
B>        // это  вызовется -  ЧЕ ЗА?
B>    }

B>    ~B()
B>    {
B>        Normal();
B>    }
B>};

B>class C : public B
B>{
B>public:
B>    virtual void Virtual() override
B>    {
B>        // это не вызовется -  ЧЕ ЗА?
B>    }
B>};


B>int _tmain(int argc, _TCHAR* argv[])
B>{

B>    C c;

B>    return 0;
B>}
B>


Деструктора C нет, соответтственно вызывается базовый класса B, в момент вызова деструктора класса B таблицы виртуальных функций класса C уже нет. Поэтому и вызывается B::Virtual (через вызов A::Normal)
Re: Вызов виртуального метода из деструктора
Здравствуйте, Barbar1an, Вы писали:


B>
B>class A
B>{
B>public:
B>    void Normal()
B>    {
B>        Virtual();
B>    }

B>    virtual void Virtual()
B>    {
B>        // это не вызовется  - ОК
B>    }

B>};

B>class B : public A
B>{
B>public:

B>    virtual void Virtual() override
B>    {
B>        // это  вызовется -  ЧЕ ЗА?
B>    }

B>    ~B()
B>    {
B>        Normal();
B>    }
B>};

B>class C : public B
B>{
B>public:
B>    virtual void Virtual() override
B>    {
B>        // это не вызовется -  ЧЕ ЗА?
B>    }
B>};


B>int _tmain(int argc, _TCHAR* argv[])
B>{

B>    C c;

B>    return 0;
B>}
B>


Деструктора C нет, соответтственно вызывается базовый класса B, в момент вызова деструктора класса B таблицы виртуальных функций класса C уже нет. Поэтому и вызывается B::Virtual (через вызов A::Normal)
По моему так!?!