You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.cc 1.7 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "../checker.h"
  2. struct A {
  3. // TODO: 正确初始化静态字段
  4. static int num_a = 0;
  5. A() {
  6. ++num_a;
  7. }
  8. ~A() {
  9. --num_a;
  10. }
  11. virtual char name() const {
  12. return 'A';
  13. }
  14. };
  15. struct B final : public A {
  16. // TODO: 正确初始化静态字段
  17. static int num_b = 0;
  18. B() {
  19. ++num_b;
  20. }
  21. ~B() {
  22. --num_b;
  23. }
  24. char name() const final {
  25. return 'B';
  26. }
  27. };
  28. int main(int argc, char **argv) {
  29. auto a = new A;
  30. auto b = new B;
  31. ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a");
  32. ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b");
  33. ASSERT(a->name() == '?', "Fill in the correct value for a->name()");
  34. ASSERT(b->name() == '?', "Fill in the correct value for b->name()");
  35. delete a;
  36. delete b;
  37. ASSERT(A::num_a == 0, "Every A was destroyed");
  38. ASSERT(B::num_b == 0, "Every B was destroyed");
  39. A *ab = new B;// 派生类指针可以随意转换为基类指针
  40. ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a");
  41. ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b");
  42. ASSERT(ab->name() == '?', "Fill in the correct value for ab->name()");
  43. // TODO: 基类指针无法随意转换为派生类指针,补全正确的转换语句
  44. B &bb = *ab;
  45. ASSERT(bb.name() == '?', "Fill in the correct value for bb->name()");
  46. // TODO: ---- 以下代码不要修改,通过改正类定义解决编译问题 ----
  47. delete ab;// 通过指针可以删除指向的对象,即使是多态对象
  48. ASSERT(A::num_a == 0, "Every A was destroyed");
  49. ASSERT(B::num_b == 0, "Every B was destroyed");
  50. return 0;
  51. }