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;

           }

    };

  • 相关阅读:
    第十七天——类与类之间的关系(一)
    Eclipse替代keil
    ssm_crud 测试mapper生成结果
    ssm_crud mybatis-generator逆向生成
    ssm_crud 搭建项目
    ssm_crud 目录篇
    mybatis SQL语句 打印
    Caused by: java.lang.ClassNotFoundException: javax.servlet.SessionCookieConfig
    Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be ope
    Spring Security开发安全的REST服务 下载
  • 原文地址:https://www.cnblogs.com/erickingxu/p/2993648.html
Copyright © 2011-2022 走看看