继承与派生
来源:互联网 发布:电子音乐制作软件ios 编辑:程序博客网 时间:2024/06/03 03:49
- 所谓继承就是从先辈处得到属性和行为特征。专业的说就是在已有类的基础上创建新的类,新类可以从一个或多个已有类中继承成员函数和数据成员,而且重新定义或加进新的数据和函数,从而引成类的层次或等级。其中,已有类称为基类或父类,在他基础上建立的类称为派生类或子类。
上图是简单的学生分类图
下面通过一个例子说明为什么要使用继承。
现在有一个学生类 Student, 它含有 number, name, score 等数据成员与成员函数 print( ), 代码如下:
class Student{public: void print() { cout<<"number:"<<number<<endl; cout<<"name:"<<name<<endl; cout<<"score:"<<score<<endl; }protected: int number; string name; float score;};
假设现在要申明一个大学生类 UStudent,它含有 number, name, score, major 等数据和成员函数 print1(),代码如下:
class UStudent{public: void print1() { cout<<"number:"<<number<<endl;//此行在Student类中已存在 cout<<"name:"<<name<<endl;//此行在Student类中已存在 cout<<"score:"<<score<<endl;//此行在Student类中已存在 cout<<"major:"<<major<<endl;//此行在Student类中 不 存在 }protected: int number;//此行在Student类中已存在 string name;//此行在Student类中已存在 float score;//此行在Student类中已存在 string major;//此行在Student类中 不 存在};
我们发现Student类和UsStudent类中有有许多相同的地方,像这样两个类,代码严重重复, 为提高代码的可重用性,可以引入继承,将UStudent类说明成Student类的派生类,那些相同的成员就不必在UsStudent类中说明了。代码如下:
class Student{public: void print() { cout<<"number:"<<number<<endl; cout<<"name:"<<name<<endl; cout<<"score:"<<score<<endl; }protected: int number; string name; float score;};class UStudent:public Student{public: void print1()//新的成员函数 { print(); cout<<"major:"<<major<<endl; }protected: string major;//新增加的数据成员};
2.基类成员在派生类中的访问属性:
3. 1派生类的构造函数和析构函数
3.1.1派生类构造函数和析构函数的调用规则
通常情况下,当创建派生类对象时,首先调用积累的构造函数,随后再调用派生类的构造函数,当撤销派生类对象时,则先调用派生类的析构函数,随后再调用基类的构造函数。
3.2派生类构造函数和析构函数的构造规则
3.2.1简单的派生类的构造函数和析构函数
当基类的构造函数没有参数,或没有显示定义构造函数时,派生类可以不向基类传递,甚至可以不定义构造函数。派生类不能继承基类中的构造函数和析构函数。当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。代码解析:
#include<iostream>#include<stdlib.h>using namespace std;class B //申明基类B{public: B(int n) //基类的构造函数 { cout<<"Constructing B class"<<endl; i = n; } ~B() //基类的析构函数 { cout<<"Destructing B class"<<endl; } void dispi() { cout<<i<<endl; }private: int i;};class D:public B //申明基类B的公有派生类D{public: D(int n, int m) //定义派生类构造函数时, :B(m) //缀上要调用的基类构造函数及其参数 { cout<<"Constructing D class"<<endl; j = n; } ~D() //派生类的析构函数 { cout<<"Destructing D class"<<endl; } void dispj() { cout<<j<<endl; }private: int j;};void Funtest(){ D obj(50,60); obj.dispi(); obj.dispj();}int main(){ Funtest(); system("pause"); return 0;}
结果如下:
未写完
0 0
- 派生类与继承
- C++继承与派生
- C++ [ 继承与派生 ]
- 继承与派生
- 继承与派生
- 继承与派生
- 继承与派生
- C++ 继承与派生
- c++继承与派生
- 继承与派生
- 派生与继承
- c++继承与派生
- 20、继承与派生
- c++继承与派生
- C++继承与派生
- 继承与派生-撞错
- 继承与派生
- C++继承与派生
- Http的请求字段和响应字段
- 模板类的使用- 简单使用
- Linux下java进程CPU占用率高-分析方法
- 第十章项目沟通管理
- 容易忘记的解决R中文乱码方法
- 继承与派生
- win10系统安装oracle11g时遇到INS-13001环境不满足最低要求
- 大型分布式网站架构技术总结
- Android OkHttp入门
- 187.Gas Station-加油站(中等题)
- 第一次从git远程仓库pull内容到本地
- 自研多通阀测试(研发阶段)
- Eclipse 各个版本区别
- <sdut-ACM>数据结构实验之串三:KMP应用