c++ - 在 C++ 中模拟静态构造函数?

标签 c++ syntax

无论如何我可以修改这个代码示例

#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/

相关文章:

sql - plpgsql 错误 : RETURN cannot have a parameter in function returning void

syntax - Kotlin 二级构造函数

if-statement - PHP、C++等语法解释

c++ - 编译错误C4715

java - token ";"出现语法错误...为什么?

c++ - 返回类型重载函数? (重访)

java - 收集、存储和检索大量数值数据

python - 在 Python 2.5 中使用 with 语句 : SyntaxError?

c++ - 命令我检查字符串得到错误的输出

java - 在 Android 上移植 Qt 代码及其工作原理