2016-09-05 4 views
0

Итак, у меня есть этот базовый класс, который создает поток, который вызывает виртуальный метод при построении. Он был разработан таким образом, потому что я просто хочу, чтобы другие разработчики переопределили этот метод, а не как конструктор, так и этот метод. Поэтому, когда я наследую этот класс, я предполагал, что метод, который будет называться, является переопределением. это не сработало. мой код для конструктора следующий:Переопределить функции потоков C++

IOHandler::IOHandler(int refresh_rate) 
{ 
    alarm_is_set = false; 
    terminate_threads = false; 
    init_complete = false; 
    update_cycle_thread = std::thread (& IOHandler::update_cycle, 
                 this, 
               refresh_rate); 
} 

но когда я создаю дочерний класс f.e.

class childClass: public IOHandler 
{ 
     void update_cycle(int refresh_rate) override; 
} 

функция, которая называется это IOHandler :: update_cycle, не переопределение, можно делать то, что я хочу сделать? С уважением

+1

Вы не должны вызывать виртуальные функции из конструктора C++. См. Http://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors – vz0

+0

@ vz0: Нет ничего плохого в вызове виртуальных функций из конструктора C++. Просто не ожидайте, что он сделает что-то, чего он не собирается делать (то есть продвигается дальше по иерархии наследования, чем до сих пор). Я понятия не имею, о чем говорят эти ответы. Теперь, делая это в создании объекта потока ... это другое :) –

+1

что-то делать с потоками в конструкторе - это почти всегда ужасная идея. Постройте свой объект, а затем вызовите 'start()' на нем. Если это невозможно, создайте обертку, которая владеет объектом и делает именно это. В противном случае путь сожаления будет вашим. –

ответ

2

You should not call a virtual function from the constructor: объект не был полностью сконструирован, и ваша переопределенная функция не будет доступна для вызова с базы. По этой причине std::thread получает объект функции как аргумент. Альтернативой обычно является вызов метода start() после построения резьбы.

+0

это сработало довольно хорошо, спасибо – heczaco