Tôi đang cố gắng tạo đối tượng service
có thể chạy (tức là thực thi chức năng run()
) trong một chuỗi riêng biệt. Đây là đối tượng phục vụC++ Thừa kế: Gọi phương thức ảo khi nó bị ghi đè
#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_;
};
Ta là tạo một lớp test
mà kế thừa từ lớp trừu tượng này và được gọi trong main()
chức năng
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;
}
Bây giờ khi tôi thực hiện điều này, tại sao tôi nhận được một lỗi nói rằng pure virtual function called
? Hàm run()
được ghi đè rõ ràng trong lớp test
. Whats tồi tệ hơn là nó chạy một cách chính xác đôi khi?
$ ./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
Điều gì có thể xảy ra ở đây?
bạn đang gọi hàm ảo 'start();' trong hàm tạo. Đó là lý do cho lỗi này. – Jagannath
@Jagannath Điều đó hoàn toàn được xác định rõ ở đây và không phải là vấn đề. – Barry
Không, không phải. Tại thời điểm này, đối tượng dẫn xuất đã được xây dựng. –