You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在构造函数中调用虚方法是否安全?特定场景的C++标准合规性问询

问题:构造函数中调用虚方法的实现安全性与标准兼容性

已知在声明虚方法(或纯虚方法)的类的构造函数中调用该虚方法是不安全的,但想了解以下实现是否安全:

class Base
{
public:
    void helper()
    {
        this->foo();
    }

protected:
     virtual void foo() = 0;
};

class Derived : public Base
{
public:
    Derived()
    {
        this->helper();
    }

protected:
    void foo() override
    {
        //...
    }
};

此处虚方法foo()在其实现类Derived的构造函数中被调用,已有可运行示例,但该实现是否符合C++标准、可兼容所有编译器?


回答

这种实现是符合C++标准且能兼容所有合规编译器的,具体原因如下:

  • 依据C++标准中构造函数内虚函数调用的核心规则:在类的构造函数执行期间,对象的动态类型等同于当前构造函数所属的类。

    • 若在Base的构造函数中调用foo(),此时对象动态类型为Base,调用纯虚函数会触发未定义行为——这也是你提到的“不安全”场景。
    • 而在Derived的构造函数中调用helper()时,Base部分已构造完成,对象动态类型为Derived,虚函数调用会直接解析到Derived::foo()。
  • 从执行顺序来看,Derived构造函数体执行前,其成员变量的初始化已完成(通过成员初始化列表),因此Derived::foo()可以安全访问自身成员,不会出现未初始化的问题。

  • 所有遵循C++标准的编译器都会按上述规则处理,正确将helper()中的foo()调用绑定到Derived的实现版本,不会触发纯虚函数调用的未定义行为。

内容的提问来源于stack exchange,提问作者Patrick Wright

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:55:12