无论如何我可以修改这个代码示例
#include <stdlib.h>
#include <iostream>
class Base {
public:
Base() {
if(!m_initialized) {
static_constructor();
m_initialized = true;
}
}
protected:
virtual void static_constructor() {
std::cout << "Base::static_constructor()\n";
}
private:
static bool m_initialized;
};
bool Base::m_initialized = false;
class Derived : public Base {
void static_constructor() {
std::cout << "Derived::static_constructor()\n";
}
};
int main(int argc, char** argv) {
Derived d;
return(EXIT_SUCCESS);
}
所以 Derived::static_constructor()
被调用而不是 Base 的?我想初始化一堆静态变量,最合乎逻辑的地方是在类中的某个地方。
最佳答案
永远不要从构造函数(或析构函数)中调用虚函数!结果不会像“预期的”那样(因此您看到的结果)。为什么?因为基类构造函数(Base)在Derived构造函数之前被调用。这意味着 Derived 中的局部数据成员(虚函数可能引用)尚未初始化。此外,也许更重要的是,vtable尚未使用 Derived 中的函数进行初始化,仅使用 Base 中的成员进行初始化。因此,虚函数还不是真正的虚函数——直到 Base() 完成并且 Derived() 被处理。
此外,这样做会破坏 Open/Closed-principle简而言之,“类应该对扩展开放,但对修改关闭”。您正在通过更改 Base 静态初始化来尝试修改其行为而不是扩展它。这在当时似乎是个好主意,但很可能以后它会咬你的屁股 ;)
关于c++ - 在 C++ 中模拟静态构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1390991/