我有一个基类和派生类,还有一个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
答案 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
的价值
哪个应该改变,哪个没问题。 (这就是这个名字
建议。)描述你想要实现的目标,也许我们可以
找到解决方案。