Fortran中指向多态对象的指针如何初始化指向派生类实例
错误原因
你尝试的foo => co(1)不符合Fortran语法规则:co(1)是构造函数生成的临时对象,临时对象在当前语句执行结束后就会被销毁,Fortran不允许指针直接绑定到临时对象上,就算语法允许也会产生悬空指针。
正确实现方案
以下三种都是合法的实现方式,可根据实际场景选择:
方案1:使用
ALLOCATE配合source参数(最简洁)
直接在分配内存时完成类型指定和成员初始化:ALLOCATE(foo, source=co(i=1))该写法会自动将
foo分配为co类型的多态对象,同时完成成员i的赋值。方案2:绑定到带
target属性的已有co类型变量
如果你有生命周期覆盖foo使用周期的实体变量,可以用该方案:! 声明带target属性的派生类变量 type(co), target :: co_inst co_inst%i = 1 ! 指针绑定到实体变量 foo => co_inst方案3:分配后通过
SELECT TYPE显式赋值
适合需要分开执行分配、赋值操作的场景:! 显式指定分配的类型为co ALLOCATE(co::foo) ! 类型选择后操作派生类专属成员 SELECT TYPE(foo) TYPE IS(co) foo%i = 1 END SELECT
你可以通过内置函数SAME_TYPE_AS(foo, co())验证类型是否设置正确,返回.true.即代表foo运行时类型为co。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

