dynamic_cast派生构造函数内部

dynamic_cast inside dervied constructor

本文关键字:构造函数 内部 派生 cast dynamic      更新时间:2023-10-16

我有一个基类和派生类,还有一个基类型和派生类型。 在基类上 我有一个 BaseType 的对象(不是指针)。我想在派生类的构造函数上执行从 BaseType 到 DerivedType 的动态强制转换。

class DerivedType: public BaseType{};
class Base{
    BaseType basetype; //not a pointer
}
class Derived : public Base{
    Derived(){
        //I want to do in this constructor a dynamic_cast from
        // "basetype" to "DerivedType"
        // when "DerivedType" inherits from "BaseType" also
    }
};

我有两个班级class DerivedType: public BaseType class Derived : public Base

Base类上,我有一个BaseType的对象(不是指针)

我需要在类Derived构造函数上将此对象的类型更改为DerivedType我的老板告诉我使用dynamic_cast

我需要这样做,因为如果我使用class C : public Derived

当我使用"basetype"时,它将自动DerivedType而不是BaseType

你不能更改成员basetype的类型,无论是使用 dynamic_cast 还是任何其他方式。
如果你的老板让你这样做,他们要么大错特错,要么没有足够清楚地传达你应该做什么。 我建议您要求澄清。

实现这一点的一种常见方法(即类型依赖于子类的成员)是将基类转换为模板,将成员的类型作为参数传递:

template<typename MemberType = BaseType>  // Default type is BaseType
class Base{
    MemberType something;
}
class Derived : public Base <DerivedType>
{
      Derived()
      {
          // 'something' has type DerivedType
      }
};

非常重要的一点:一旦一个对象被构造出来,它的类型是固定的,无论如何都无法更改。 如果Base有成员命名为 basetype ,该对象由 Base ,在任何派生类可以访问它之前,以及它的类型对象是在Base中声明的内容,并且永远不能更改。您可以在其上使用dynamic_cast(例如 dynamic_cast<DerivedType&> ),但这个演员阵容肯定会失败。

目前尚不清楚您要实现的目标。 也许是某种变体策略模式就是您正在寻找的,其中Base::basetype是对传递给 Base::Base() 的对象的指针或引用 Derived::Derived() . 或者这真的是basetype的价值哪个应该改变,这没有问题。 (这就是名字建议。 描述您要实现的目标,我们也许可以找到解决方案。