在构造函数中调用虚方法是否安全?特定场景的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
相关产品推荐
相关产品推荐

