第01讲 继承和派生的基本概念、单一继承
6.1 继承和派生的基本概念
继承关系是类与类之间的类属关系
类:人
类:学生
类:教师
在已有类的基础上定义新的类称为类的派生,新产生的类为派生类,原来的类为基类。
(一般与特殊的关系)
继承关系是类与类之间的类属关系
类:人
类:学生
类:教师
从成员构成来看,派生类具有基类的所有成员,基类又叫父类,派生类又叫子类。
类的继承是指:派生类继承基类的所有数据成员和成员函数。用于表示类间的类属关系。非构成关系。
派生类的特点:
1.增加新成员。
2.重定义已有成员函数。
3.改变基类的成员的访问权限。
姓名、年龄、性别。。。。
6.2 单一继承
6.2.1一般形式
class 派生类名:访问控制 基类名
{ private:
成员列表;
public:
成员列表;
protected:
成员列表;
};
6.2.2派生类的构造函数和析构函数
派生类中继承的基类的成员初始化时,需要由派生类的构造函数调用基类的构造函数。
派生类的构造函数一般形式:
派生类名::派生类名(参数):基类名(参数)
{
//函数体
}
构造函数和析构函数不能被继承。
类的派生实例
有类human对象用于存放人的相关信息:
姓名,年龄,性别
并能利用成员函数实现相关信息输出。
在此基础上定义类student类,具有学号、班级信息,并能完成信息的输出显示。
定义类,并设计测试程序。
运行结果:
人 李斯 诞生了
学生 1001 诞生了
my name is 李斯
my age is 20
ma sex is 女
my num is 1001
my class is 07信1
学生 1001 over
人 李斯 over 了
Press any key to continue
问题:在student类中能否直接使用human类中的name,sex,age等成员??
此时程序无法运行!!!!!
类A定义中由private限定的成员只能在类A中使用。
student虽然是human的派生类也不可使用human类中的private成员,所以在student中定义的show函数不可使用human中的name,sex,age等私有成员。
6.2.3类的保护成员protected
公有派生得到的派生类不能使用基类的私有成员。
那么如何解决派生类中访问基类的成员呢?并且不能打破封装性:基类的对象仍不可使用这些成员。
6.2.3类的保护成员protected
公有派生得到的派生类不能使用基类的私有成员。
protected限定的成员具有公有和私有双重性质。
该类成员在派生类中可访问,其他非成员函数不可访问。
6.2.3类的保护成员protected
人 李斯 诞生了
学生 李斯 诞生了
my name is 李斯
my age is 20
my sex is 女
my num is 1001
my class is 07信1
学生 李斯 over
人 李斯 over 了
Press any key to continue
公有派生得到的派生类不能使用基类的私有成员。
protected限定的成员具有公有和私有双重性质
该类成员在派生类中可访问,其他函数不可访问。
复习上节
基类、派生类、继承
派生类的特点:
1.增加新成员
2.重定义已有函数
3.改变成员访问权限
派生类的定义形式:
class 派生类名:访问控制 基类名
{ private:
成员列表;
public:
成员列表;
protected:
成员列表;
};
派生类的定义形式:
公有派生的特点:
派生类中可访问基类中的protected成员
派生类中可访问基类中的public成员
派生类中不可访问基类中的private成员
公有派生和保护成员
protected限定的成员具有公有和私有双重性质
在基类中是私有的,在派生类中可访问。
问题:
1.基类的对象是否可访问protected成员?
2.派生类的对象是否可访问公有派生类中继承自基类的protected成员?
3.基类的成员函数是否可访问基类中的protected成员?
4.派生类的成员函数是否可访问公有派生类中继承自基类的protected成员?
派生类的构造函数和析构函数:
派生类的构造函数不能由基类继承而得
派生类的构造函数一般形式:
派生类名::派生类名(参数):基类名(参数)
{
//函数体
}
派生类的构造函数和析构函数:
当产生一个派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。
当释放一个派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。
6.2.3类的保护成员protected
6.2.4访问权限和赋值兼容规则
1.公有派生和赋值兼容规则
a,基类的公有成员在派生类中仍是公有的。
b,基类的保护成员在派生类中仍是保护的。
c,基类的私有成员在派生类中是不可访问的。
d,基类的不可访问成员在派生类中仍不可访问。
什么是类的不可访问成员????
例如:若human类中name是private的,
则,student类不可访问
若student做某个类A的基类时,类A仍不可访问name
基类对象和派生类对象的相互赋值。
每个学生都是人。
说明:student类的每个对象都是human类的对象。
每个人不一定是学生。
说明:human类的每个对象不一定是student类的对象。
基类对象和派生类对象的相互赋值。
每个学生都是人。
说明:student类的每个对象都是human类的对象。
a,派生类的对象可赋值给基类的对象。
b,派生类的对象可以初始化基类的引用
c,派生类的对象地址可赋值给基类的指针
此时基类的引用或指针只能访问派生类中继承自基类的成员。
a,派生类的对象可赋值给基类的对象。
b,派生类的对象可以初始化基类的引用
c,派生类的对象地址可赋值给基类的指针
此时基类的对象、引用或指针只能访问派生类中继承自原基类的成员。
人 李斯 诞生了
学生 李斯 诞生了
人 张三 诞生了
my name is 李斯
my age is 20
my sex is 女
人 张三 over 了
学生 李斯 over
人 李斯 over 了
Press any key to continue
2.isa和has-a的区别
类与类间的关系:
isa关系: 继承和派生关系。
has-a关系: 一个类使用另一个类的对象作成员
一般来说:公有继承关系和isa关系是等价的。
但某些情况下: 企鹅是鸟
鸟会飞
企鹅会飞吗?
对象作成员表示has-a关系
3.公有继承存取权限表
什么是公有继承?????
基类 private public protected
派生类 不可访问 public protected
基类对象 不可访问 可访问 不可访问
派生类对象 不可访问 可访问 不可访问
4.私有派生
定义派生类时,用private限定
class 派生类名:private 基类名
{ private:
成员列表;
public:
成员列表;
protected:
成员列表;
};
定义派生类时,用private限定
基类的私有成员和不可访问成员在派生类中不可访问
基类的公有成员和保护成员变为私有成员
假定有基类:base
定义派生类时,用private限定
问题:
问题:d对象是否可以使用fun1函数??
基类的私有成员和不可访问成员在派生类中不可访问
基类的公有成员和保护成员变为私有成员
派生类的对象不可访问继承自基类的所有成员,派生类的成员函数可访问继承自基类的protected成员和public成员
5,保护派生
定义派生类时,用protected限定
降级使用
基类中的private变为不可访问
protect变为private
public 变为protected
降级使用
基类中的private变为不可访问
protected变为private
public 变为protected
第02讲 多重继承、二义性及其支配规则
6.3 多重继承
一般形式:
class 类1:访问控制 类2, 访问控制 类3
{
private:
//私有成员
protected:
//保护成员
public:
//公有成员
}
多重继承中成员访问权限的变化同单一继承!
以下访问是指在派生类的成员函数中使用成员
公有派生:
基类的private成员在派生类中可否访问?
基类的protected成员在派生类中可否访问?
基类的public成员在派生类中可否访问?
私有派生:
基类的private成员在派生类中可否访问?
基类的protected成员在派生类中可否访问?
基类的public成员在派生类中可否访问?
多重继承中成员访问权限的变化同单一继承!
保护派生:
基类的private成员在派生类中可否访问?
基类的protected成员在派生类中可否访问?
基类的public成员在派生类中可否访问?
6.4 二义性及其支配规则
6.4.1作用域分辨符和成员名限定
当派生类中从多个基类中继承得到同名函数时,在派生类中使用这些函数时,须使用类名限定!
派生类的对象使用这些函数时,也需要进行类名限定!
类名::成员名
6.4.2派生类支配基类的同名函数
C++的支配规则:
★在基类和派生类有重名的成员时,优先派生类的成员如果要访问基类成员,必须加上作用域符::
★私有(private)成员派生类不可以访问,只有本类和友类可以访问
★如果派生类要访问基类的成员,基类成员应该用protected限定。
另注意:
一个类B不能从类A直接继承2或2次以上
第六章复习总结
类的单一公有继承、单一私有继承、单一保护继承、多重继承 规则
派生类的构造函数定义形式,及调用顺序
派生类的析构函数调用顺序。
protected成员
派生类和基类对象的赋值兼容规则
二义性及其支配规则(作用域限定)