Как предотвратить вызов виртуальной функции в конструкторе или Desturctor?
Вопрос
Некоторые материалы 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 и выполнить вызов функции с общеобразованием.