zoukankan      html  css  js  c++  java
  • 子类中调用父类的带参数的构造函数|子类构造函数调用父类构造函数 的说明

    下面我们修改一下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; 
        }

        注意程序中以粗体显示的代码。在fish类的构造函数后,加一个冒号(:),然后加上父类的带参数的构造函数。这样,在子类的构造函数被调用时,系统就会去调用父类的带参数的构造函数去构造对象。这种初始化方式,还常用来对类中的常量(const)成员进行初始化,如下面的代码所示:
        class point 
        { 
        public: 
             point():x(0),y(0) 
        private: 
             const int x; 
             const int y; 
        };

        当然,类中普通的成员变量也可以采取此种方式进行初始化,然而,这就没有必要了。

    大部分转载 小部分自写
  • 相关阅读:
    汇编讲解(上)--逆向开发
    两数之和 II
    解析器模式--设计模式
    访问者模式--设计模式
    命令模式--设计模式
    ccf-201512-2 消除类游戏
    ccf-201503-2 数字排序
    移动端兼容和适配问题
    ccf-201409-2 画图
    ccf-201409-3 字符串匹配
  • 原文地址:https://www.cnblogs.com/8586/p/1978445.html
Copyright © 2011-2022 走看看