dynamic_cast里面的派生构造函数

时间:2014-12-02 14:30:28

标签: c++ dynamic-cast

我有一个基类和派生类,还有一个BaseType和DerivedType。在Base类上我有一个BaseType的对象(不是指针)。 我希望Derived类的构造函数能够从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

2 个答案:

答案 0 :(得分:2)

您无法更改成员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
      }
};

答案 1 :(得分:0)

一个非常重要的观点:一旦构造了一个对象,它的类型就是 固定,永远不会改变,无论如何。如果Base有成员 命名为basetype,该对象由构造函数构造 Base,在任何派生类可以访问它之前,以及它的类型 对象是声明在Base中的对象,永远不会被更改。 您可以在其上使用dynamic_cast(例如dynamic_cast<DerivedType&>), 但是保证会失败。

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