详解C++编程中多级派生时的构造函数和访问属性

所属分类: 软件编程 / C 语言 阅读数: 59
收藏 0 赞 0 分享

C++多层派生时的构造函数
一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构。在上面叙述的基础上,不难写出在多级派生情况下派生类的构造函数。

通过例下面的程序,读者可以了解在多级派生情况下怎样定义派生类的构造函数。相信大家完全可以自己看懂这个程序。

[例] 多级派生情况下派生类的构造函数。

#include <iostream>
#include<string>
using namespace std;
class Student//声明基类
{
public://公用部分
  Student(int n, string nam)//基类构造函数
  {
   num=n;
   name=nam;
  }
  void display( )//输出基类数据成员
  {
   cout<<"num:"<<num<<endl;
   cout<<"name:"<<name<<endl;
  }
protected://保护部分
  int num;//基类有两个数据成员
  string name;
};
class Student1: public Student//声明公用派生类Student1
{
public:
  Student1(int n,char nam[10],int a):Student(n,nam)//派生类构造函数
  {age=a;}//在此处只对派生类新增的数据成员初始化
  void show( ) //输出num,name和age
  {
   display( ); //输出num和name
   cout<<"age: "<<age<<endl;
  }
private://派生类的私有数据
  int age; //增加一个数据成员
};
class Student2:public Student1 //声明间接公用派生类Student2
{
public://下面是间接派生类构造函数
  Student2(int n, string nam,int a,int s):Student1(n,nam,a) {score=s;}
  void show_all( ) //输出全部数据成员
  {
   show( ); //输出num和name
   cout<<"score:"<<score<<endl; //输出age
  }
private:
  int score; //增加一个数据成员
};
int main( )
{
  Student2 stud(10010,"Li",17,89);
  stud.show_all( ); //输出学生的全部数据
  return 0;
}

运行时的输出如下:

num:10010
name:Li
age:17
score:89

请注意基类和两个派生类的构造函数的写法。

基类的构造函数首部:

  Student(int n, string nam)


派生类Student1的构造函数首部:

  Student1(int n, string nam],int a):Student(n,nam)


派生类Student2的构造函数首部:

  Student2(int n, string nam,int a,int s):Student1(n,nam,a)


注意不要写成:

  Student2(int n, string nam,int a,int s):Student1(n,nam),student1(n, nam, a)

不要列出每一层派生类的构造函数,只需写出其上一层派生类(即它的直接基类)的构造函数即可。在声明Student2类对象时,调用Student2构造函数;在执行Student2构造函数时,先调用Student1构造函数;在执行Student1构造函数时,先调用基类Student构造函数。初始化的顺序是:
先初始化基类的数据成员num和name。
再初始化Student1的数据成员age。
最后再初始化Student2的数据成员score。

C++类多级派生时的访问属性
在实际项目开发中,经常会有多级派生的情况。如图11.9所示的派生关系:类A为基类,类B是类A 的派生类,类C是类B的派生类,则类C也是类A的派生类;类B称为类A 的直接派生类,类C称为类A的间接派生类;类A是类B的直接基类,是类 C的间接基类。

在多级派生的情况下,各成员的访问属性仍按以上原则确定。

为了把多重继承说的更加详细,请大家先看下面的几个继承的类。

[例] 如果声明了以下的类:

class A //基类
{
public:
  int i;
protected:
  void f2( );
  int j;
private:
  int k;
};
class B: public A //public方式
{
public:
  void f3( );
protected:
  void f4( );
private:
  int m;
};
class C: protected B //protected方式
{
public:
  void f5( );
private:
  int n;
};

类A是类B的公用基类,类B是类C的保护基类。各成员在不同类中的访问属性如下:

根据以上分析,在派生类C的外面只能访问类C的成员函数f5,不能访问其他成员。 派生类C的成员函数f5能访问基类A的成员i、f2、j和派生类B的成员f3、f4。派生类B 的成员函数f3、f4能访问基类A的成员i、f2和j。

通过以上分析,可以看到:无论哪一种继承方式,在派生类中是不能访问基类的私有成员的,私有成员只能被本类的成员函数所访问,毕竟派生类与基类不是同一个类。

如果在多级派生时都采用公用继承方式,那么直到最后一级派生类都能访问基类的公用成员和保护成员。

如果采用私有继承方式,经过若干次派生之后,基类的所有的成员已经变成不可访问的了。

如果采用保护继承方式,在派生类外是无法访问派生类中的任何成员的。

而且经过多次派生后,人们很难清楚地记住哪些成员可以访问,哪些成员不能访问,很容易出错。因此,在实际中,常用的是公用继承。

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多