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

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

    大部分转载 小部分自写
  • 相关阅读:
    Python自动化 【第十八篇】:JavaScript 正则表达式及Django初识
    Python自动化 【第十七篇】:jQuery介绍
    Python自动化 【第十六篇】:JavaScript作用域和Dom收尾
    Python自动化 【第十五篇】:CSS、JavaScript 和 Dom介绍
    Python自动化 【第十四篇】:HTML介绍
    Python自动化 【第十二篇】:Python进阶-MySQL和ORM
    Python自动化 【第十一篇】:Python进阶-RabbitMQ队列/Memcached/Redis
    Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与SelectPollEpoll异步IO
    Python自动化 【第九篇】:Python基础-线程、进程及python GIL全局解释器锁
    Python自动化 【第八篇】:Python基础-Socket编程进阶
  • 原文地址:https://www.cnblogs.com/8586/p/1978445.html
Copyright © 2011-2022 走看看