• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 解析C++中多层派生时的构造函数及一些特殊形式

解析C++中多层派生时的构造函数及一些特殊形式

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++派生类构造函数,c++继承与派生,c++派生类,c++类的继承与派生,c++继承与派生实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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;
}
</div>

运行时的输出如下:

num:10010
name:Li
age:17
score:89
</div>

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

基类的构造函数首部:

  Student(int n, string nam)
</div>


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

  Student1(int n, string nam],int a):Student(n,nam)
</div>


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

  Student2(int n, string nam,int a,int s):Student1(n,nam,a)
</div>


注意不要写成:

  Student2(int n, string nam,int a,int s):Student1(n,nam),student1(n, nam, a)
</div>

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

C++派生类构造函数的特殊形式
在使用派生类构造函数时,有以下特殊的形式。

1) 当不需要对派生类新增的成员进行任何初始化操作时,派生类构造函数的函数体可以为空,即构造函数是空函数,函数体为空时,派生类构造函数的参数个数等于基类构造函数和子对象的参数个数之和,派生类构造函数的全部参数都传递给基类构造函数和子对象,在调用派生类构造函数时不对派生类的数据成员初始化。此派生类构造函数的作用只是为了将参数传递给基类构造函数和子对象,并在执行派生类构造函数时调用基类构造函数和子对象构造函数。在实际工作中常见这种用法。

2) 如果在基类中没有定义构造函数,或定义了没有参数的构造函数,那么在定义派生类构造函数时可不写基类构造函数。因为此时派生类构造函数没有向基类构造函数传递参数的任务。调用派生类构造函数时系统会自动首先调用基类的默认构造函数。

如果在基类和子对象类型的声明中都没有定义带参数的构造函数,而且也不需对派生类自己的数据成员初始化,则可以不必显式地定义派生类构造函数。因为此时派生类构造函数既没有向基类构造函数和子对象构造函数传递参数的任务,也没有对派生类数据成员初始化的任务。

在建立派生类对象时,系统会自动调用系统提供的派生类的默认构造函数,并在执行派生类默认构造函数的过程中,调用基类的默认构造函数和子对象类型默认构造函数。

如果在基类或子对象类型的声明中定义了带参数的构造函数,那么就必须显式地定义派生类构造函数,并在派生类构造函数中写出基类或子对象类型的构造函数及其参数表。

如果在基类中既定义无参的构造函数,又定义了有参的构造函数(构造函数重载),则在定义派生类构造函数时,既可以包含基类构造函数及其参数,也可以不包含基类构造函数。

在调用派生类构造函数时,根据构造函数的内容决定调用基类的有参的构造函数还是无参的构造函数。编程者可以根据派生类的需要决定采用哪一种方式。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++派生访问说明符小记(推荐)
  • C++ 类中有虚函数(虚函数表)时 内存分布详解
  • 浅谈C++中派生类对象的内存布局
  • C++聚合关系类的构造函数的调用顺序详解
  • 解析C++中多层派生时的构造函数及一些特殊形式
  • 深入解析C++中派生类的构造函数
  • 深入分析C++派生类中的保护成员继承
  • 解析C++中派生的概念以及派生类成员的访问属性
  • 解读C++编程中派生类的构成和创建
  • c++制作的时间函数类

相关文章

  • 2017-05-28C++实现ping程序实例
  • 2017-05-28解析C++中四种强制类型转换的区别详解
  • 2017-05-28C++获取任务栏打开程序窗口示例
  • 2017-05-28浅谈C++中的构造函数分类及调用规则
  • 2017-05-28C语言文件操作函数freopen详细解析
  • 2017-05-28怎么用C++提取任意一张图片的特征(从内存读取数据)
  • 2017-05-28C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)
  • 2017-05-28详解C语言 三大循环 四大跳转 和判断语句
  • 2017-05-28Linux C 时间函数应用
  • 2017-05-28linux之sort命令的用法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 基于C++实现的线程休眠代码
    • C++ 学习之旅三 我和超级玛丽有个约会
    • C++内存查找实例
    • c++如何分割字符串示例代码
    • 浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr
    • Linux下控制(统计)文件的生成的C代码实现
    • 深入分析C++中deque的使用
    • 针对Ruby的Selenium WebDriver安装指南
    • 如何用矩形法(梯形法)求定积分
    • Cocos2d-x中实现弹出对话框示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有