|
- #include "../checker.h"
-
- struct A {
- // TODO: 正确初始化静态字段
- static int num_a = 0;
-
- A() {
- ++num_a;
- }
- ~A() {
- --num_a;
- }
-
- virtual char name() const {
- return 'A';
- }
- };
- struct B final : public A {
- // TODO: 正确初始化静态字段
- static int num_b = 0;
-
- B() {
- ++num_b;
- }
- ~B() {
- --num_b;
- }
-
- char name() const final {
- return 'B';
- }
- };
-
- int main(int argc, char **argv) {
- auto a = new A;
- auto b = new B;
- ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a");
- ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b");
- ASSERT(a->name() == '?', "Fill in the correct value for a->name()");
- ASSERT(b->name() == '?', "Fill in the correct value for b->name()");
-
- delete a;
- delete b;
- ASSERT(A::num_a == 0, "Every A was destroyed");
- ASSERT(B::num_b == 0, "Every B was destroyed");
-
- A *ab = new B;// 派生类指针可以随意转换为基类指针
- ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a");
- ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b");
- ASSERT(ab->name() == '?', "Fill in the correct value for ab->name()");
-
- // TODO: 基类指针无法随意转换为派生类指针,补全正确的转换语句
- B &bb = *ab;
- ASSERT(bb.name() == '?', "Fill in the correct value for bb->name()");
-
- // TODO: ---- 以下代码不要修改,通过改正类定义解决编译问题 ----
- delete ab;// 通过指针可以删除指向的对象,即使是多态对象
- ASSERT(A::num_a == 0, "Every A was destroyed");
- ASSERT(B::num_b == 0, "Every B was destroyed");
-
- return 0;
- }
|