在对象的构造函数中不应使用其动态类型
8.15 ID_virtualCallInConstructor
对象的“动态类型(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 的构造函数中判断动态类型是无效的。
相关
依据
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