C++ 继承/派生、访问属性、构造函数

1.子类继承父类的继承方式:public,private,protected,不写则默认为private;

 

2.子类会继承父类的全部成员(除了构造函数、析构函数,虽然析构函数有virtual,但是不是继承的意思),全盘接受,没得选,不能只继承一部分,而不继承另一部分,这样就可能造成数据冗余,在继承时可能会继承了一大堆没用的东西,这个问题目前的c++也无法解决,所以继承时父类的选择要谨慎。但是,可以改变继承的成员在子类中的访问属性,即可能全盘继承了父类的成员之后访问不了!!!

 

3.

父类中的访问属性 继承方式 子类中的访问属性
private public/protected/private 不可访问
public public public
public protected protected
public private private
protected public protected
protected protected protected
protected private private

 

 

4.protected成员在本类内相当于private,但是在子类中就不一样了,子类中可以访问父类的protected成员。若某类声明了protected成员,就说明这个类可能要当作父类,是为了继承做准备的。

 

5.类外可访问类的public成员,不可访问类的private和protected成员。

 

6.构造函数是为了初始化类的数据成员,可以不自己定义,这样系统就会自动设置默认构造函数,也可以自己定义。因为构造函数不能继承,所以子类在初始化时要同时初始化父类,一般是在定义子类构造函数时调用父类的构造函数,声明子类构造函数时不用加上父类构造函数。

  形式:子类构造函数名(总参数表,即所有参数):父类构造函数名(参数表)

  {

      //子类新增成员初始化

  }

  e.g.student1(int n,string nam,char s,int a,string ad):student(n,nam,s)

  {

     //新增成员初始化

  }

  上述student为父类,student1为子类。

  这种方式其实和构造函数的初始化列表是一样的,如

  box(int h,int w,int l):height(h),width(w),length(len) { //新增成员初始化 }

  其实就是利用初始化表调用父类的构造函数,也可以将两者结合起来,即既有初始化表,也有父类构造函数调用,如

  student1(int n,string nam,char s,int a,string ad):student(n,nam,s),age(a),addr(ad) { }

  若一个类的数据成员中包括类对象,即对象中的对象,则可用如下方式定义:

  student1(int n,string nam,int n1,string nam1,string ad):student(n,nam),monitor(n1,nam1)

  { 

  ...

  }

  上述monitor为student1中的对象(student类型的)。

 

7.子类和父类的转换:可以把子类的对象赋值给父类的对象,而不能反过来(没有指针的事)。

指向父类对象的指针也可以指向子类,但是只能访问子类中从父类继承的部分,不能访问子类自己新增的部分。若父类指针指向子类,则指针类型自动转换,由子类转为父类(e.g. father* p=new son;),这样,指针指向的就是子类中的父类部分。

 

8.类的组合:一个类中的数据成员包含另一个类的对象,类的组合是横向的,说明了是否拥有某一属性。类的继承是纵向的,说明了是否属于某一事物。组合和继承是软件重用的重要方式。

posted on 2017-08-22 16:16  chakyu  阅读(206)  评论(1编辑  收藏  举报

导航