将派生类型转换为基本类型

Converting Derived Type to Base Type

本文关键字:类型 派生 类型转换      更新时间:2023-10-16

我正在尝试学习从基类到派生类的类型铸造。该样本将向您展示我要做的事情。我知道这不是一个有效的解决方案。我只是想为我的软件创建动态体系结构,并为建议和解决方案开放。

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;
}