C++ 多态性:这种(潜在的密集性)使用静态_会导致死亡吗?

C++ 多态性:这种(潜在的密集性)使用静态_会导致死亡吗?,c++,polymorphism,abstract-class,static-cast,C++,Polymorphism,Abstract Class,Static Cast,以下是上下文:模型有一个(指向)参数和一个输出Model和Parameter是抽象类。我们使用Model*类型的指针来操作Model的各种派生(具体)类,其指向Parameter的指针动态指向Parameter的各种派生(具体)类的实例 下面是这些类的简化版本作为示例。我知道应该避免使用new,或者至少在delete之后使用,但我省略了主题外的代码行(例如析构函数) //抽象类 类参数{ 公众: 虚拟空重新初始化()=0; }; 类模型{ 公众: 模型(参数*argt){ptr_param=ar

以下是上下文:
模型
有一个(指向)
参数
和一个
输出
Model
Parameter
是抽象类。我们使用
Model*
类型的指针来操作
Model
的各种派生(具体)类,其指向
Parameter
的指针动态指向
Parameter
的各种派生(具体)类的实例

下面是这些类的简化版本作为示例。我知道应该避免使用
new
,或者至少在
delete
之后使用,但我省略了主题外的代码行(例如析构函数)

//抽象类
类参数{
公众:
虚拟空重新初始化()=0;
};
类模型{
公众:
模型(参数*argt){ptr_param=argt;}
虚拟void computeModelOutput()=0;
双输出;
参数*ptr_param;
};
//具体类别
参数类:公共参数{
公众:
AcertainOfParameter(int argt){value=argt;}
虚拟空重新初始化(){value=1;}
int值;
};
模型类别:公共模型{
公众:
ACertainKindOfModel(int argt):模型(新ACertainKindOfParameter(argt)){}
虚拟void计算模型输出(){
输出=10.0+(双精度)(静态_-cast(ptr_-param)->值);
}
};
int main(){
模型myModel{5}的一个实例;
Model*ptr_Model=&myModel;
ptr_模型->计算模型输出();

std::cout output有几种方法可以使它更干净。如果
Model
不需要访问
ptr_param
,您可以将其从
Model
中删除,并使用正确的类型将其存储在每个派生类中

或者,您可以将
静态\u cast
封装在每个模型类中的getter函数中:

ACertainKindOfParameter *getParam() const { return static_cast<ACertainKindOfParameter *>(ptr_param); }
然后,在每个模型中,声明协变覆盖:

virtual ACertainKindOfParameter *getParam() const override { return ptr_param; }
假设ptr_参数是在
tainkindofmodel
中声明的。如果不是,则需要如上所述应用
static_cast


或者您可以在Cudio<代码>函数中保存<代码> StistalCase<代码>的结果以避免多次使用.< /P>您将如何处理值?如果是计算,查看其他类必须知道值是什么。如果显示,请考虑添加一个在n中返回值的虚拟吸气剂。eutral形式类似于

字符串
@user4581301实际上,
主要用于计算,如我编写的代码片段所示,它也可能出现在
if(value==R)
等情况下(尤其是
不是数字的情况下)。感谢您对访问者模式的建议。“我知道应该避免使用新代码”。所以使用智能指针:甚至更少的代码行。@Mark Ransom我还有另一个问题,关于代码的总体设计。当然,我在OOP中描述了一种非常常见的情况,但在我(确实很小)的经验中,我从未听说cast是一种不可避免的“附带损害”"从多态性。如果此站点上没有人发现它有任何问题,那么我将接受
静态\u cast
解决方案。我看到重新初始化并没有使用它。我看到传入的参数,存储在父级中,忘记了它们的类型,然后在子级中检索。存储在父级中似乎毫无意义;如果存储在子级中,则类型将我的个人结论是:我尝试了无数的事情,主要归结为最初的
static\u cast
。制作
Parameter
模板类几乎奏效,但最终失败,因为模板参数推导。
virtual Parameter *getParam() const = 0;
virtual ACertainKindOfParameter *getParam() const override { return ptr_param; }