2.2.6 类的继承(2)
编译运行,出现如图2.11所示的结果。
可以看到当构造fish类的对象fh时,animal类的构造函数也要被调用,而且在fish类的构造函数调用之前被调用。当然,这也很好理解,没有父亲就没有孩子,因为fish类从animal类继承而来,所以在fish类的对象构造之前,animal类的对象要先构造。在析构时,正好相反。
|
| 图2.11 EX06.CPP程序的运行结果 |
2.在子类中调用父类的带参数的构造函数
下面我们修改一下animal类的构造函数,增加两个参数height和weight,分别表示动物的高度和重量。代码如例2-13所示。
例2-13
- #include <iostream.h>
- class animal
- {
- public:
- animal(int height, int weight)
- {
- cout<<"animal construct"<<endl;
- }
- ~animal()
- {
- cout<<"animal destruct"<<endl;
- }
- void eat()
- {
- cout<<"animal eat"<<endl;
- }
- void sleep()
- {
- cout<<"animal sleep"<<endl;
- }
- void breathe()
- {
- cout<<"animal breathe"<<endl;
- }
- };
- class fish:public animal
- {
- public:
- fish()
- {
- cout<<"fish construct"<<endl;
- }
- ~fish()
- {
- cout<<"fish destruct"<<endl;
- }
- };
- void main()
- {
- fish fh;
- }
当我们编译这个程序时,就会出现如下错误:
那么这个错误是如何出现的呢?当我们构造fish类的对象fh时,它需要先构造animal类的对象,调用animal类的默认构造函数(即不带参数的构造函数),而在我们的程序中,animal类只有一个带参数的构造函数,在编译时,因找不到animal类的默认构造函数而出错。
因此,在构造fish类的对象时(调用fish类的构造函数时),要想办法去调用animal类的带参数的构造函数,那么,我们如何在子类中向父类的构造函数传递参数呢?可以采用如例2-14所示的方式,在构造子类时,显式地去调用父类的带参数的构造函数。
例2-14
- #include <iostream.h>
- class animal
- {
- public:
- animal(int height, int weight)
- {
- cout<<"animal construct"<<endl;
- }
- …
- };
- class fish:public animal
- {
- public:
- fish():animal(400,300)
- {
- cout<<"fish construct"<<endl;
- }
- …
- };
- void main()
- {
- fish fh;
- }