☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

在对象的构造函数中不应使用其动态类型

8.15 ID_virtualCallInConstructor
目录 › next › previous

对象的“动态类型(dynamic type)”在其构造过程中不生效。

执行基类构造函数时,派生类对象尚未构造完毕,基类构造函数不能使用派生类动态类型。

对于正在构造的对象,不应:

  • 调用派生类重写的虚函数
  • 通过 typeid 判断对象的动态类型
  • 通过 dynamic_cast 转换对象的动态类型

注意,如果在构造函数中调用未实现的纯虚函数会导致标准未定义的行为。

示例:

struct A {
    int tag;
    A();
    virtual ~A() = default;
};

struct B: public A {
};

A::A() {
    if (typeid(*this) == typeid(B)) {   // Non-compliant, always false
        tag = 2;
    } else {
        tag = 1;
    }
}

B b;  // ‘b.tag’ is 1

在基类 A 的构造函数中判断动态类型是无效的。

相关

ID_virtualCallInDestructor

依据

ISO/IEC 14882:2003 10.4(6)-undefined ISO/IEC 14882:2011 10.4(6)-undefined

参考

C++ Core Guidelines C.82 MISRA C++ 2008 12-1-1 Effective C++ item 9
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.