我在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
如何使用这两个结构并在运行时生成正确的类型,但在不将其转换为基类型的情况下保持多态性?
在此代码中:
BaseStruct retval; //Struct to be passed back
retval = (boolLogicCondition) ? BaseStruct() : DerivedStruct();
选择运算符生成值,而不是引用。
对类型为
BaseStruct
的retval
的赋值无论如何都会将结果分片到BaseStruct
。
Re
”如何使用这两个结构并在运行时生成正确的类型,但在不将其转换为基类型的情况下保持多态性?
…获取多态行为的一种方法是返回一个指向工厂实例的指针,而不是按值返回:
auto FileReader::GetSetupStruct(String^ parameter)
-> std::unique_ptr<BaseStruct>
{
if( boolLogicCondition )
{
return std::make_unique<BaseStruct>();
}
else
{
return std::make_unique<DerivedStruct>();
}
}
免责声明:即兴代码甚至没有被编译器扫过一眼。
在其他上下文中,选择运算符可以生成引用。例如,使用相同类型的两个变量a
和b
,可以执行
auto* p = &(condition? a : b);
但在上面的代码中,可供选择的子表达式都是右值表达式,或者更非正式地说,“价值";无法将内置&
地址运算符应用于.的表达式