zoukankan      html  css  js  c++  java
  • 子类别忘了父类的带参构造函数!!!

    前不久,看到这么一个代码段,让找出错误:

    class Base{

            private:int i;

            public:

            Base(int x){

                   i=x;

            }

    };

    class Devd:public Base{

           private: int i;

           public:

           Devd(int x,int y){

                   i=x;

           }

           void getval(){

                  i=Base::i+i;

           }

    };

    分析:很多人可能直接说子类构造函数没有初始化父类变量,但是我要问,你是如何看出来的?这个问题问得其实很简单,但却涉及到子类访问父类权限的问题。

    因为子类的构造函数和父类的构造函数都不是默认的无参函数,这就要求我们在子类中使用父类参数的时候,要明确两点:1.这个参数的权限是否对子类开放?2.子类的构造函数有无责任帮助完成父类的构造函数?

    回答上面的问题,其实并不难,你在C++的入门书籍上都有提到过,但是没人太注意。我想大多原因是你的基类中都写着一个默认的无参构造函数。否则你不信可以调试一下没有无参函数的结果,常会出现这样的编译期错误:Erro C25xx:'Base' :no appropriate default constructor avaliable!

    这就是原因,因为实例化时,计算机是先从父类开始构造的,无参的构造是无法在Base基类完成实例生成,所以这个错误是存在的。

    但是这还只是其中的一个致命错误,还有第一问的问题,你的参数权限,因为你下面在子类中调用了Base::i,而i是private,在子类是不可用的,故要把i的属性改为protected,或public;

    下面就是修改后的代码段:

    class Base{

            protected:int i;

            public:

            Base(int x){

                   i=x;

            }

    };

    class Devd:public Base{

           private: int i;

           public:

           Devd(int x,int y):Base(y){

                   i=x;

           }

           void getval(){

                  i=Base::i+i;

           }

    };

  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/erickingxu/p/2993648.html
Copyright © 2011-2022 走看看