Iva*_*nov 5 c++ inheritance constructor c++20
例如,存在类的层次结构Base -> A -> B。
每当A::A()被调用时,实际要构造的对象可能是 class A,然后它是最后一个被调用的 ctor ;或 class B,然后B::B()稍后会调用。是否可以区分这些情况并检测当前正在调用的构造函数是否属于实际正在构造的类型?
引人注目的解决方案是使用typeid:
A::A() {
if (typeid(this) == typeid(A*)) {
// A is the actual type of the object being constructed
}
}
Run Code Online (Sandbox Code Playgroud)
但是,typeid(以及 vtable)在构造函数和析构函数中的工作方式不同,并且不公开最终类,而是返回有关当前(静态)类本身的信息。这是因为层次结构中更深层的类的构造函数尚未被调用,因此从已构造的父类访问它们是非法的。请参阅cppreference解释部分的最后一段。
我不需要知道正在构造的对象的确切类型,而只需要检测当前构造函数是否是最终构造函数。有可能做到吗?
我可以修改类的主体Base和所有其他类的构造函数。A和的身体B不受我的控制。
C++20 就可以了。
编辑:我将尝试详细说明哪些代码可以修改,哪些不能修改。
首先,我拥有对Base. 它始终是层次结构的基类。
然后库的用户可以像这样定义后代类:
class A : public Base
{
REGISTER(A);
// some user code
};
class B : public A
{
REGISTER(B);
// some other user code
};
Run Code Online (Sandbox Code Playgroud)
该REGISTER宏由库提供。特别是,它定义了特定类型的构造函数(这就是我控制它的方式)。如果用户定义了其他构造函数,则行为是未定义的,因此我们可以假设我们的构造函数是唯一的。请注意,我们不知道碱基的名称,因此我们无法从;中显式调用A's ctor。B此外,可能存在多个基地,甚至是虚拟基地。
我正在寻找的技巧将被放入REGISTER宏中。