推荐答案
测试一下
题目
假设:class trans_ext extends trans_base;
A.trans_ext tr_el;
B.trans_ext tr_el;
C.trans_ext tr_el;
D.trans_ext tr_el;
参考答案与知识点
参考答案
正确选项为A。选项A中,tr_e1创建trans_ext对象,基类句柄tr_b指向该对象,然后使用$cast(tr_e2, tr_b)将tr_b向下转型为trans_ext句柄并赋值给tr_e2。由于tr_b实际指向的是trans_ext对象,故转型成功,tr_e2可访问a并正确打印。选项B中,$cast(tr_b, tr_e2)试图将未初始化的派生类句柄赋给基类句柄,且打印时tr_e2为null,出错。选项C中,$cast(tr_e2, tr_e1)虽然类型相同可成功,但$display格式中%后有多余空格,导致格式错误无法正确打印。选项D中,$cast(tr_e1, tr_e2)将null赋给tr_e1,且打印的tr_e2也为null,出错。因此只有A能正确打印a。
涉及知识点
- $cast向下转型
- 类型兼容性检查
- 句柄赋值与动态类型
- 格式说明符语法
- 空指针访问错误