C ++对象被上传到基类;无法调用派生方法

时间:2017-01-09 18:01:37

标签: c++ visual-c++ struct polymorphism c++-cli

我在C ++中有一个class个对象和一个struct个对象。 struct负责使用CSV文件中的数据填充class。 所以扩展的是当我创建一个派生类时,我还创建了一个派生结构,它可以正确地填充这个相似但不同的派生类。

struct BaseStruct {
    double var = 0;
    vector<double> vectorA;
    virtual BaseClass^ generateClass() {return gcnew BaseClass(this->var, this->vectorA);}
};
struct DerivedStruct : BaseStruct {
    vector<double> vectorB;
    virtual BaseClass^ generateClass() override {return gcnew ChildClass(this->var, this->vectorA, this->vectorB);}
};

然后,另一个执行文件读取的对象使用该结构,并将多态结构返回给用户;

BaseStruct FileReader::GetSetupStruct(String^ parameter)
    {
        BaseStruct retval; //Struct to be passed back
        retval = (boolLogicCondition) ? BaseStruct() : DerivedStruct(); //Should return correct type of struct
        return retval;
    }

但是,当我尝试使用下面的代码时,通过将其称为基类,它会自动恢复为基类(失去额外的vectorB属性)及其多态性。

我怀疑它失去了派生状态,因为a)当我从三元运算符返回时,它在局部变量窗口中的类型发生变化b)setupStruct.generateClass()只执行基类方法

BaseStruct setupStruct = FileReader::GetSetupStruct(parameter);//Returns struct - type should depend on parameters
    Signal^ mySignal = setupStruct.generateClass(); //Should run either derived or base method

如何在运行时使用这两个结构并生成正确的类型,但保持多态性,而不会将其提升为基类型?

1 个答案:

答案 0 :(得分:1)

在此代码中:

BaseStruct retval; //Struct to be passed back
retval = (boolLogicCondition) ? BaseStruct() : DerivedStruct();
  • 选择运算符会生成,而不是参考。

  • retval类型BaseStruct的分配,无论如何将结果切分为BaseStruct

RE

  

如何在运行时使用这两个结构并生成正确的类型,但保持多态性,而不会将其提升为基类型?

...获得多态行为的一种方法是返回指向工厂实例的指针,而不是按值返回:

auto FileReader::GetSetupStruct(String^ parameter)
    -> std::unique_ptr<BaseStruct>
{
    if( boolLogicCondition )
    {
        return std::make_unique<BaseStruct>();
    }
    else
    {
        return std::make_unique<DerivedStruct>();
    }
}

免责声明:关闭袖口代码甚至没有被编译器瞥见。

在其他情况下,选择运算符可以生成引用。例如,使用相同类型的两个变量ab,您可以执行

auto* p = &(condition? a : b);

但是在上面的代码中,可供选择的子表达式都是rvalue表达式,或者更为非正式的“值”表达式,你无法将内置的&地址运算符应用于。