Как предотвратить вызов виртуальной функции в конструкторе или Desturctor?

StackOverflow https://stackoverflow.com/questions/4495640

  •  12-10-2019
  •  | 
  •  

Вопрос

Некоторые материалы C ++ упоминаются, что мы не можем назвать виртуальную функцию внутри CTOR или DTOR,

(
Извините, я думаю, что лучше изменить
Некоторые материалы C ++ упоминают, что нам лучше не называть виртуальную функцию внутри CTOR или DTOR,

)

Но мы можем позвонить им случайно. Есть ли способ предотвратить это?

Например:

# include < iostream >  
using namespace std;  

class CAT  
{  
public:  
    CAT(){ f();}  
    virtual void f(){cout<<"void CAT:f()"<<std::endl;}  
};  

class SMALLCAT :public CAT  
{  
public:  
    SMALLCAT():CAT()  
    {  
    }  
    void f(){cout<<"void SMALLCAT:f()"<<std::endl;}    
};    

int main()  
{  
    SMALLCAT sc;   

}  

выход:

void CAT::f()  //not we expected!!!

Спасибо

Нет правильного решения

Другие советы

Вам нужно бросить эти «материалы C ++» в мусорное ведро.

Вы, конечно, Можно Вызовите виртуальные функции из конструктора или деструктора. И они сделают свою работу. Вам просто нужно знать о спецификации языка, которая четко указывает, что механизм виртуального диспетчерского управления работает в соответствии с Текущий динамический тип объекта, а не с его финал Предполагаемый динамический тип. Эти типы не одинаковы для строящегося объекта/разрушения, который часто сбивает с толку новичков, когда они пытаются вызвать виртуальные функции из конструкторов/деструкторов. Тем не менее, вызов виртуальных функций из конструктора и деструктора является полезной особенностью языка, если вы знаете, что они делают и как они работают в таких случаях. Зачем вам это «предотвратить» это?

Это все равно, что сказать, что оператор дивизии опасен, поскольку можно разделить что -то на ноль и спрашивать, как «предотвратить» его использование в программе.

Вы можете вызвать виртуальную функцию внутри деструктора. Только в некоторых случаях это не сработает, и может разбить вашу программу. Способ не звонить им - не звонить им. Я не знаю ничего более причудливого, кроме, кроме, возможно, некоторых статических инструментов анализа, чтобы посмотреть на ваш код и предупредить вас о потенциальных проблемах, подобных этой.

Вы, конечно, можете вызвать виртуальную функцию внутри CTOR/DTOR. Проблема заключается в том, что ваш VTable настроен в каждом конструкторе (и деструкторе), поэтому ваш вызов виртуальной функции будет вызывать реализацию класса, который в настоящее время настраивается. Если это то, что вы хотите, круто. Но тогда вы также можете сохранить себе поиск vtable и выполнить вызов функции с общеобразованием.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top