,我有以下的东西作为一个非常大的代码库的一部分:C++虚函数连接古怪
class FooObserver {
public:
virtual void FooObjectChanged() = 0;
};
class MainStuff : public FooObserver ... /* a long list of other base classes */ {
/* a pretty big class with many things in it */
public:
/* ... */
void FooObjectChanged();
void doSomething();
};
void MainStuff::doSomething() {
this->FooObjectChanged();
FooObserver* o = this;
o->FooObjectChanged();
}
void MainStuff::FooObjectChanged() {
std::cout << "object changed\n";
}
我的C++标准的理解是,这是有效的代码和FooObjectChanged()没有任何将被称为两次doSomething()运行时出错。
但在我的应用程序中,第二次调用失败。 (段落错误,或者更确切地说iOS上的EXC_BAD_ACCESS)
如果我删除MainStuff :: FooObjectChanged()(body和它的声明),我会期望链接器失败并抱怨抽象类。它不是。它链接,然后程序崩溃的第一个电话虚拟功能与
libc++abi.dylib: Pure virtual function called!
这是怎么回事?什么可能导致这些问题? FooObserver不是任何其他的基类,只是MainStuff的基类。
构造函数不应该是一个纯虚函数!它也不应该是一个虚拟功能! – Steve 2014-10-28 03:13:16
你的意思是构造函数?这在C++中甚至不是虚拟的,所以它们都不在这个应用程序中。 – pramparam 2014-10-28 03:28:31
你是直接还是间接地从*构造函数中调用*?此外,“干净”,看看它是否继续崩溃。 – 2014-10-28 03:39:41