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; 
        };

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

    大部分转载 小部分自写
  • 相关阅读:
    java 泛型 -- 泛型类,泛型接口,泛型方法
    android:id="@id/resid" , andorid:id="@+id/resid" 的区别
    Ubuntu16.04 + Win 10 双系统 时间同步,启动项顺序,NumLock指示灯常亮
    Linux 下 Console / 控制台 复制粘贴快捷键
    Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid、dhroid..
    JQuery的Ajax跨域请求的
    1031. Hello World for U (20)
    项目进阶 之 集群环境搭建(三)多管理节点MySQL集群
    Tomcatserverhttps协议配置简单介绍
    Unity3D
  • 原文地址:https://www.cnblogs.com/8586/p/1978445.html
Copyright © 2011-2022 走看看