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

posted @   balabalahhh  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示