小明希望设计一个支持函数重载的语言 P#。
在 P# 中,所有的类型都继承于 Any 类型,同时不存在多继承和接口,从而使得继承关系可以表达为一棵树,每个类型在这棵树上的深度被称为具体度。
Any
同时,P# 中支持函数重载。每个重载的函数所有形参的类型均不同。
而如果存在两个同名的重载函数的所有形参的类型都是某处对同名的函数的调用的对应实参的类型或其基类时,优先选择第一个参数具体度更高的函数调用,如果第一个参数类型相同,那么优先选择第二个参数具体度更高的函数调用...如果倒数第二个参数类型相同,那么优先选择最后一个参数具体度更高的函数调用。
小明希望你能设计一段程序,以找到每处实际调用的函数是哪个。
给这段程序输入中仅出现 P# 中的类型与函数定义语句与调用语句的精简版本:
{花括号内为注释,中括号内为可变文本,可变文本均由数字字母组成,且长度不超过 100,输入数据中无注释} DeclareType [TypeName]; {定义名称为 TypeName 的类型,直接继承于 Any, Any 不需要定义} DeclareType [TypeName] Extends [BaseType]; {定义名称为 TypeName 的类型,继承于 BaseType,BaseType 与 TypeName 的定义顺序可任意} DeclareFunc [FuncName]([TypeName1], [TypeName2], ..., [TypeNameN]); {定义名称为 FuncName 的函数,有 n 个参数,其类型分别为 TypeName1, ..., TypeNameN} CallFunc [FuncName]([TypeName1], [TypeName2], ..., [TypeNameN]); {调用名称为 FuncName 的函数,有 n 个参数,其类型分别为 TypeName1, ..., TypeNameN}
请对于每个 CallFunc 函数调用语句,输出实际调用的函数的 DeclareFunc 函数定义语句。
CallFunc
DeclareFunc
输入数据的第一行一个整数 T(1≤T≤10)T(1\leq T\leq 10)T(1≤T≤10),表示测试数据组数。
接下来每个测试数据第一行三个整数 a,b,c(1≤a,b,c≤103)a,b,c(1\leq a,b,c\leq 10^3)a,b,c(1≤a,b,c≤103)。
接下来 aaa 行,每行一个类型定义语句 DeclareType。
DeclareType
接下来 bbb 行,每行一个函数定义语句 DeclareFunc,输入保证每个函数的参数不超过 505050 个。
接下来 ccc 行,每行一个函数调用语句 CallFunc,输入保证每个调用均合法。
请对于每个 CallFunc 函数调用语句,输出一行,为实际调用的函数的 DeclareFunc 函数定义语句(请保证与输入的函数定义语句完全一致)。
1 4 2 1 DeclareType C Extends A; DeclareType D Extends B; DeclareType A; DeclareType B; DeclareFunc D(C, B); DeclareFunc D(A, D); CallFunc D(C, D);
DeclareFunc D(C, B);