C ++继承:重写时调用虚方法
C++ Inheritance : Calling virtual method when it has been overridden
我正在尝试构建一个 service
对象,它可以在单独的线程中 运行(即执行它的 run()
函数)。这是服务对象
#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
class 继承自此抽象 class 并在 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
class 中被覆盖了。更糟糕的是它 运行 有时是正确的?
$ ./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
这里可能出了什么问题?
跟随,一步一步:
1) 你构造对象。
2) 你执行下面这段代码:
if (started_.load() == false) {
started_ = true;
thread_ = std::thread([&] () {
run();
});
}
父线程立即returns到main()
立即退出并销毁你的对象。
这是你的错误:
- 您不能保证在
start()
中启动的线程会在父线程终止进程之前到达上面对 run()
的调用。子线程和父线程同时运行。
所以,每隔一段时间,父线程会在子线程启动之前销毁对象,并调用run
()。
此时,调用 run
() 方法的对象已经被销毁。
未定义的行为。
您偶尔遇到的断言是此未定义行为的一个可能结果。
我正在尝试构建一个 service
对象,它可以在单独的线程中 运行(即执行它的 run()
函数)。这是服务对象
#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
class 继承自此抽象 class 并在 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
class 中被覆盖了。更糟糕的是它 运行 有时是正确的?
$ ./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
这里可能出了什么问题?
跟随,一步一步:
1) 你构造对象。
2) 你执行下面这段代码:
if (started_.load() == false) {
started_ = true;
thread_ = std::thread([&] () {
run();
});
}
父线程立即returns到main()
立即退出并销毁你的对象。
这是你的错误:
- 您不能保证在
start()
中启动的线程会在父线程终止进程之前到达上面对run()
的调用。子线程和父线程同时运行。
所以,每隔一段时间,父线程会在子线程启动之前销毁对象,并调用run
()。
此时,调用 run
() 方法的对象已经被销毁。
未定义的行为。
您偶尔遇到的断言是此未定义行为的一个可能结果。