c++继承和派生的理解

来源:互联网 发布:apache启动和停止命令 编辑:程序博客网 时间:2024/06/16 05:30

定义 

继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称子类)。

    派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。

派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public 。

在派生类的各个成员函数中,不能访问基类中的private成员。

派生类可以有自己的成员函数 如果和基类成员函数同名将覆盖。

派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。

在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。


继承方式的问题: 继承方式可以是public,private和protected 

这用于说明派生类的实例对象和派生类的派生类对其从基类继承来的成员变量的访问控制!

对于class 默认省略继承方式时采用private继承方式!

派生类会继承基类的所有成员,那么基类的成员将会变成派生类的什么成员?

这是由于基类成员的访问机制和派生类的继承方式共同决定的。

public:

基类的public成员在派生类中成为public成员。

基类的protected成员在派生类中成为protected成员。

基类的private成员在派生类中成为不可直接使用的成员。

private:

基类的public成员在派生类中成为private成员。

基类的protected成员在派生类中成为private成员。

基类的private成员在派生类中成为不可直接使用的成员。

protected:

基类的public成员在派生类中成为protected成员。

基类的protected成员在派生类中成为protected成员。

基类的private成员在派生类中成为不可直接使用的成员。

除了基类的private成员其余成员均可以在基类中调整其访问控制!

调整方式:

调整方式:基类名::基类成员名;



定义派生类的时候一定要见到基类的定义,定义一个类的时候就是要告诉编译器要给这个类对象分配多大的内存,

如果没有基类的定义,编译器就不知道要给派生类分配多大的内存!

一般来说,基类的友元函数不是派生类的友元函数。

-----------------------------------------------------------------------------------------------------------------------------------------------------

类之间的关系:

第一种:继承关系 -“是”的关系。

基类 A,B是基类A的派生类。
–逻辑上要求:“一个B对象也是一个A对象”。

第二种:复合关系-“有”的关系。

–类C中“有”成员变量k,k是类D的对象,则C和D是复合关系
–一般逻辑上要求:“D对象是C对象的固有属性或组成部分”。


访问范围说明符
5 基类的private成员: 可以被下列函数访问
•基类的成员函数
•基类的友员函数 基类的public成员: 可以被下列函数访问
•基类的成员函数
•基类的友员函数
•派生类的成员函数
•派生类的友员函数
•其他的函数

基类的protected成员: 可以被下列函数访问
•基类的成员函数
•基类的友员函数
•派生类的成员函数可以访问当前对象的基类的保护成员

尤其注意访问从基类继承的protected成员! 

派生类的成员函数只能访问当前对象的protected成员,也就是通过this指针访问,

非当前对象的不可以访问。

------------------------------------------------------------------------------------------------------------

访问控制:

public:成员的访问不受控制,在程序的任何地方都可以访问一个类的public成员。

private:成员只能在本类和友元中访问。

protected:成员只能在本类,派生类和友元中访问。


派生类对象 包含 基类对象 执行派生类构造函数之前, 先执行基类的构造函数

在 创建 派生类的对象 时,
•需要调用 基类的构造函数:
初始化派生类对象中从基类继承的成员
•在执行一个派生类的构造函数之前,
总是先执行基类的构造函数

所以在进入派生类的构造函数之前需要显示的调用基类的构造函数,也就是用初始化列表的形式先初始化基类的成员变量。

调用基类构造函数的两种方式
•显式方式:
派生类的构造函数中  基类的构造函数提供参数
derived::derived(arg_derived-list):base(arg_base-list)
•隐式方式:
派生类的构造函数中, 省略基类构造函数时
派生类的构造函数, 自动调用基类的默认构造函数 派生类的析构函数被执行时, 执行完派生类的析构函数后, 自动调用基类的析构函数

调用基类的默认构造函数前提得有默认构造函数!一旦重写了构造函数,编译器就不会在生成默认构造函数。


创建 派生类的对象 时, 执行 派生类的构造函数 之前:
•调用 基类 的构造函数
 初始化派生类对象中从基类继承的成员
•调用 成员对象类 的构造函数
初始化派生类对象中成员对象 执行完 派生类的析构函数 后:
•调用 成员对象类 的析构函数
•调用 基类 的析构函数 析构函数的调用顺序与构造函数的调用顺序相反