Skip to content

1338: 继承图谱Pro

题目

题目描述

题出废了

类的继承错综复杂,应用时继承谱可能会过于庞大。

请写代码来帮助分析对象的声明、赋值与析构。

为了简化字符串操作,本题中的输入规则与c++的类声明有很大的不同,但继承逻辑是遵循c++的继承逻辑的。

本题中,类的声明部分如下:

类名 占一行,不超过30个字符 字符串 virtual 或 none,virtual表示该类的析构函数是虚函数,none则表示不作定义,与c++的规定保持一致 整数 k0 表示有k0个基类 接下来k0行,每行是 `继承方式(public,private,protected) 基类名` 来表示一个继承关系

本题中,先出现的类才会成为后出现的类的基类。且数据保证继承关系不会出现棱形、环形继承。继承的深度不超过100。

输入格式

第一行是整数n和m。

接下来是n个类的声明,声明的规则见上。

紧接着是m个询问。

每个询问为

1、new一个类的实例 new 类名 指针名

2、定义一个类的指针 pointer 类名 指针名,初始值为空

3、将类的实例赋值给类的指针 let 指针名1 指针名2。如果指针1不能接收指针2(类型不一样或非派生类),则输出Invalid assignment,占一行,且不影响指针1的值。

4、对某指针执行删除操作delete 指针名,如果该指针所指对象已经被删除,则输出Double deleted,占一行。

最后输出每个类的构造函数/析构函数被调用了多少次,按声明顺序输出,格式为:

类名 构造函数调用数 析构函数调用数

所有的类名、对象名、指针名都唯一

输出格式

Input Format每个输出占一行。

样例输入

Sample 1

2 5 Base none 0 Derived none 1 public Base new Derived d pointer Base b let b d delete b delete d

Sample 2

4 11 Base1 virtual 0 Base2 none 0 Derive1 none 1 public Base1 Derive2 virtual 1 public Base2 pointer Base1 bp1 pointer Base2 bp2 delete bp1 new Derive1 dp1 new Derive2 dp2 let bp1 dp1 let bp2 dp2 let bp1 dp2 delete bp1 delete bp2 delete dp1

样例输出

Sample 1

```

```

Sample 2

Invalid assignment Double deleted Base1 1 1 Base2 1 1 Derive1 1 1 Derive2 1 0

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!