继 承
继承的概念
派生类的定义
派生类的生成过程
派生类的访问权限控制
派生类的构造和析构主要内容类的层次关系
保持已有类的特性而构造新类的过程称为继承。
在已有类的基础上新增自己的特性而产生新类的过程称为派生。
被继承的已有类称为基类(或父类)。
派生出的新类称为派生类。
继承的目的就是体现从特殊到一般类的继承和派生生活中的继承和派生
继承的目的:实现代码重用。
派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。
C++引入继承的目的
char name[20]
int age
int sex
GetName
GetAge
GetSex
Display
Person::Person
Person
char name[20]
int age
int sex
GetName
GetAge
GetSex
Person::Display
Person::Person
int id[9]
float score
GetId
GetScore
Display
Student char name[20]
int age
int sex
GetName
GetAge
GetSex
Display
Person::Person
Person
int id[9]
float score
GetId
GetScore
Display
Student
派生类生成示例
分析派生新类的过程可知,派生类的生成经历了三个步骤:
吸收基类成员;
改造基类成员;
添加派生类新成员。
派生类的生成过程
class <派生类名 >:<继承方式 > <基类名 >
{
<派生类新定义成员 >
};
<继承方式 >有三种:公有继承、私有继承和保护继承,分别用关键字 public、
private和 protected表示。缺省情况下为私有继承。
派生类的定义
不同继承方式的影响主要体现在:
1、派生类 成员 对基类成员的访问控制。
2、派生类 对象 对基类成员的访问控制。
三种继承方式
公有继承
私有继承
保护继承访问权限控制
基类的 public和 protected成员的访问属性在派生类中 保持不变,但 基类的 private
成员 不可访问 。
派生类中的成员函数可以直接访问基类中的 public和 protected成员,但不能访问基类的 private成员。
通过派生类的对象只能访问基类的 public
成员。
公有继承 (public)
void main()
{
char name[11];
cout<<"Enter a person′s name:";
cin>>name;
Person p1(name,29,′m′);
p1.Display();
cout<<"Enter a student′s name:";
cin>>name;
Student s2(name,20,′m′,"03410102",80);
s2.Person::Display();
s2.Display();
}
示例公有继承
基类的 public和 protected成员都以 private
身份出现在派生类中,但基类的 private
成员 不可访问 。
派生类中的成员函数可以直接访问基类中的 public和 protected成员,但不能访问基类的 private成员。
通过派生类的对象不能访问基类中的任何成员。
私有继承 (private)
class Student:private Person
{
//…
};
void Student::Display()
{
cout<<"name:"<<GetName()<<′\t′;
cout<<"id:"<<id<<′\t′;
cout<<"age:"<<age<<′\t′; )
cout<<"sex:"<<GetSex()<<endl;
cout<<"score:"<<m_Score<<endl;
}
void main()
{
Student s2("wang min",20,′m′,"03410102",80);
s2.Display();
}
示例私有继承
基类的 public和 protected成员都以
protected身份出现 在派生类中,但基类的 private成员 不可访问 。
派生类中的成员函数可以直接访问基类中的 public和 protected成员,但不能访问基类的 private成员。
通过派生类的对象不能访问基类中的任何成员保护继承 (protected)
外部访问保护成员 (横向访问 )时,它与
private 成员的性质相同。
对于其派生类来说 (纵向访问 )时,它与
public 成员的性质相同。
既实现了数据隐藏,又方便继承,实现代码重用。
protected成员的特点和作用派生类中基类成员的访问属性
public private protected
公有成员 公有 私有 保护私有成员 不可访问 不可访问 不可访问保护成员 保护 私有 保护
格式:
派生类的构造函数
<派生类名 >(<总参数表 >):<基类名 >(<参数表 1>),<子对象名 >(<参数表 2>)
{
<派生类数据成员的初始化 >
};
#include <iostream.h>
class A
{
public:
A(){cout<<"A Constructor"<<endl;}
};
class B:public A
{
public:
B(){cout<<"B Constructor"<<endl;}
};
void main()
{
B b;
}
继承中构造函数调用示例
首先,调用基类构造函数,调用顺序按照它们被继承时声明的基类名顺序执行。
其次,调用对象成员类构造函数,调用次序按各个对象在派生类内声明的顺序。
最后,执行派生类构造函数体中的内容。
派生类构造函数执行次序
基类的析构函数也不能被继承,因此,
派生类的析构函数必须通过调用基类的析构函数来做基类的一些清理工作。
调用顺序:
派生类的析构函数对象成员类的析构函数基类的析构函数
与调用构造函数的顺序相反。
派生类的析构函数
#include <iostream.h>
class A
{
public:
A(){cout<<"A Constructor"<<endl;}
~A(){cout<<"A Destructor"<<endl;}
};
class B:public A
{
public:
B(){cout<<"B Constructor"<<endl;}
~B(){cout<<"B Destructor"<<endl;}
};
void main()
{
B b;
}
构造和析构顺序示例