Я пытаюсь создать объект service
, который может запускаться (т. Е. Выполнять его функцию run()
) в отдельном потоке. Это объект службыC++ Наследование: вызов виртуального метода, когда он был переопределен
#include <boost/noncopyable.hpp>
#include <atomic>
#include <thread>
#include <iostream>
class service : public boost::noncopyable {
public:
service() : stop_(false), started_(false) { }
virtual ~service() {
stop();
if (thread_.joinable()) {
thread_.join();
}
}
virtual void stop() { stop_ = true; }
virtual void start() {
if (started_.load() == false) {
started_ = true;
thread_ = std::thread([&]() {
run();
});
}
}
protected:
virtual void run() = 0;
std::atomic<bool> stop_;
std::atomic<bool> started_;
std::thread thread_;
};
Я создать test
класс, который наследуется от абстрактного класса и вызывается в функции main()
class test : public service {
public:
test() : service() {
std::cout<< "CTOR" << std::endl;
start();
}
~test() {
std::cout<< "DTOR" << std::endl;
}
protected:
void run() override {
std::cout << "HELLO WORLD" <<std::endl;
}
};
int main() {
test test1;
return 0;
}
Теперь, когда я исполню это, почему я получаю ошибка pure virtual function called
? Функция run()
явно переопределена в классе test
. Что еще хуже, что он работает правильно иногда?
$ ./a.out
CTOR
DTOR
pure virtual method called
terminate called without an active exception
$ ./a.out
CTOR
DTOR
pure virtual method called
terminate called without an active exception
$ ./a.out
CTOR
DTOR
pure virtual method called
terminate called without an active exception
$ ./a.out
CTOR
DTOR
HELLO WORLD
$ ./a.out
CTOR
DTOR
pure virtual method called
terminate called without an active exception
Что может быть неправильно здесь?
Вы вызываете виртуальную функцию 'start();' в конструкторе. В этом причина этой ошибки. – Jagannath
@Jagannath Это совершенно четко определено здесь и не является проблемой. – Barry
Нет, это не так. На этом этапе уже построенный производный объект уже построен. –