【发布时间】:2014-12-23 09:08:44
【问题描述】:
作为一个非常大的代码库的一部分,我有以下内容:
class FooObserver {
public:
virtual void FooObjectChanged() = 0;
};
class MainStuff : public FooObserver {
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()(主体及其声明),我希望链接器会因抱怨抽象类而失败。但编译器不会失败。它链接,然后程序在第一次调用虚函数时崩溃
libc++abi.dylib: Pure virtual function called!
发生了什么事?什么可能导致这些问题? FooObserver 不是其他任何东西的基类,只是 MainStuff 的基类。
【问题讨论】:
-
构造函数不能是纯虚函数!而且也不应该是虚函数!
-
你是说构造函数?这在 C++ 中甚至不能是虚拟的,所以它们都不在这个应用程序中。
-
您是直接还是间接地将其 from 称为构造函数?另外,
make clean看看它是否一直在崩溃。 -
它不是从构造函数中调用的。但是“make clean”似乎是在正确的方向,我仍在努力确保,但似乎 XCode 搞砸了构建。
标签: c++ inheritance clang abstract-class virtual-functions