博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
子类别忘了父类的带参构造函数!!!
阅读量:4636 次
发布时间:2019-06-09

本文共 939 字,大约阅读时间需要 3 分钟。

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

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;

       }

};

转载于:https://www.cnblogs.com/erickingxu/archive/2013/04/01/2993648.html

你可能感兴趣的文章
Linux 文件系统及 ext2 文件系统
查看>>
复习笔记之母函数
查看>>
进军ABP第一天:ABP理论知识
查看>>
GitHub上整理的一些工具【转载】
查看>>
jenkins ssl证书报错问题解决
查看>>
《BI项目笔记》用Excel2013连接和浏览OLAP多维数据集
查看>>
C语言对mysql数据库的操作
查看>>
SQL Server 数据库备份
查看>>
INNO SETUP 获得命令行参数
查看>>
http编程学习(C#)
查看>>
DNN 数据访问策略 (转)
查看>>
Sublime Text 自动换行
查看>>
mybatis逆向工程配置文件怎么再偷懒(懒出天际)
查看>>
hdu1160FatMouse's Speed(DP)
查看>>
Codeforces Round #228 (Div. 1)B
查看>>
poj2420A Star not a Tree?(模拟退火)
查看>>
switch case
查看>>
crash
查看>>
ASP.NET MVC 4 (十三) 基于表单的身份验证
查看>>
day3----编码-集合-深浅copy-文件操作-函数初识
查看>>