026:编程填空:统计动物数量
知识点1:static静态变量在类内声明,但必须在类外初始化
知识点2:构造函数不能是虚函数
为什么C++的构造函数不可以是虚函数,而析构函数可以是虚函数 - 知乎 (zhihu.com)
知识点3:如果基类构造函数里所有参数有缺省值,那么派生类函数可以不为其初始化,基类会自行用缺省值初始化变量
知识点4: 虚析构函数(摘自mooc上课件ppt)
在构造函数和析构函数中调用虚函数,不是多态!!编译时即可确定,调用的函数是自己的类或基类中定义的函数,不会等到运行时才决定调用自己的还是派生类的对象
a.通过基类的指针删除派生类对象时,通常情况下只调用基类的析构函数
但是 ,删除一个派生类对象时,应该先调用派生类的析构函数,然后调用基类的析构函数;
b.解决办法:把基类的析构函数声明为virtual
派生类的析构函数可以virtual不进行声明
通过基类的指针删除派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数
c.一般来说,一个类如果定义了虚函数,则应该将析构函数也定义成虚函数。或者,一个类打算作为基类使用,也应该将析构函数定义成虚函数
i.
1 #include <iostream> 2 using namespace std; 3 class Animal{ 4 public: 5 static int number; 6 Animal(int num = 1){Animal::number = Animal::number + num;} 7 virtual ~Animal(){-- Animal::number;} 8 }; 9 int Animal::number = 0; 10 11 class Dog:public Animal{ 12 public: 13 static int number; 14 Dog(int num = 1){ 15 Dog::number = Dog::number + num; 16 } 17 ~Dog(){-- Dog::number;} 18 }; 19 int Dog::number = 0; 20 21 class Cat:public Animal{ 22 public: 23 static int number; 24 Cat(int num = 1){ 25 Cat::number = Cat::number + num; 26 } 27 ~Cat(){-- Cat::number;} 28 }; 29 int Cat::number = 0; 30 void print() { 31 cout << Animal::number << " animals in the zoo, " << Dog::number << " of them are dogs, " << Cat::number << " of them are cats" << endl; 32 } 33 34 int main() { 35 print(); 36 Dog d1, d2; 37 Cat c1; 38 print(); 39 Dog* d3 = new Dog(); 40 Animal* c2 = new Cat; 41 Cat* c3 = new Cat; 42 print(); 43 delete c3; 44 delete c2; 45 delete d3; 46 print(); 47 }
ii.
1 #include <iostream> 2 using namespace std; 3 class Animal{ 4 public: 5 static int number; 6 Animal(/*int num = 1*/){} 7 virtual ~Animal(){-- Animal::number;} 8 }; 9 int Animal::number = 0; 10 11 class Dog:public Animal{ 12 public: 13 static int number; 14 Dog(int num = 1){ 15 Animal::number = Animal::number + num; 16 Dog::number = Dog::number + num; 17 } 18 ~Dog(){-- Dog::number;} 19 }; 20 int Dog::number = 0; 21 22 class Cat:public Animal{ 23 public: 24 static int number; 25 Cat(int num = 1){ 26 Animal::number = Animal::number + num; 27 Cat::number = Cat::number + num; 28 } 29 ~Cat(){-- Cat::number;} 30 }; 31 int Cat::number = 0; 32 void print() { 33 cout << Animal::number << " animals in the zoo, " << Dog::number << " of them are dogs, " << Cat::number << " of them are cats" << endl; 34 } 35 36 int main() { 37 print(); 38 Dog d1, d2; 39 Cat c1; 40 print(); 41 Dog* d3 = new Dog(); 42 Animal* c2 = new Cat; 43 Cat* c3 = new Cat; 44 print(); 45 delete c3; 46 delete c2; 47 delete d3; 48 print(); 49 }
2个代码体现了知识点3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)