将派生类型转换为基本类型
Converting Derived Type to Base Type
我正在尝试学习从基类到派生类的类型铸造。该样本将向您展示我要做的事情。我知道这不是一个有效的解决方案。我只是想为我的软件创建动态体系结构,并为建议和解决方案开放。
enum EComponentType
{
Base = 0,
Material = 1
};
class FComponent
{
public:
FComponent() { m_type = EComponentType::Base; }
EComponentType type() { return m_type; }
protected:
EComponentType m_type;
};
class FMaterial : public FComponent
{
public:
FMaterial() { m_type = EComponentType::Material; }
void setValue(int value) { m_value = value; }
int value() { return m_value; }
private:
int m_value;
};
int main(int argc, char *argv[])
{
FMaterial material;
material.setValue(22);
QVector<FComponent> Components;
Components << material;
for (int i = 0; i < Components.size(); i++)
{
switch (Components[i].type())
{
case EComponentType::Material:
FMaterial material = (FMaterial)(Components[i]); // --> invalid of course
int value = material.value();
break;
}
}
return 0;
}
更新1:
int main(int argc, char *argv[])
{
QVector<FComponent*> Components;
FMaterial material;
material.setValue(22);
Components << &material;
for (int i = 0; i < Components.size(); i++)
{
switch (Components[i]->type())
{
case EComponentType::Material:
FMaterial *m = static_cast<FMaterial*>(Components[i]);
int value = m->getValue();
qDebug() << value;
break;
}
}
return 0;
}
所以这是由于表现或任何其他原因引起的好选择吗?会有很多类和许多类型?
,尽管我不同意您的整体设计是如何修复解决方案的方法:
使用static_cast
代替dynamic_cast
,它将起作用。如果您将至少一个虚拟功能放在基类中,但dynamic_cast
也将起作用
编辑:我还注意到您尝试铸造价值,如果您必须在课堂指针或参考文献上进行演员!
进行演员!class FComponent
{
public:
// Withtout this if you delete an FComponent* then the destructor of the derived class isn't called.
virtual ~FComponent() {}
};
class FMaterial : public FComponent
{
};
int test()
{
QVector<FComponent*> Components;
FMaterial* material = new FMaterial;
Components << material;
for (int i = 0; i < Components.size(); i++)
{
switch (Components[i].type())
{
case EComponentType::Material:
FMaterial* material = static_cast<FMaterial*>(Components[i]);
int value = material->value();
break;
}
}
// Somewhere later in your code....
for (int i = 0; i < Components.size(); i++)
delete Components[i];
// TODO: remove all deleted pointers from Components
return 0;
}
相关文章:
- 存储模板类型以强制转换回派生<T>
- 在 C++ 中用派生类型重写成员函数
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 在 C++ 中将对象转换为派生类型
- 如何检查派生类的类型?(C++实例)
- 创建派生自可变参数模板包的类型元组
- C++如果采用类类型的函数被传递派生类型,有没有办法给出错误?
- 返回派生类型时出现协变类型错误
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- (C++);动态决定函数的类型(派生类)
- 如何使variadic模板类方法以函数指针为参数,类型派生自函数模板
- 如何防止从 c++03 中的类型派生
- 如何为从特定类型派生的类型专门化模板
- 为什么在返回从函数的返回类型派生的类型本地对象时不选择 move 构造函数?
- 如何在模板类型中强制静态成员初始化?或如何获取从模板类型派生的所有类的计数
- 有没有任何方法可以从C++中的成员指针类型派生对象类型
- 在c++中基于另一个变量类型派生一个变量类型