当前位置:   article > 正文

C++(day 1) 继承-基类与派生类_c ++基类和派生类

c ++基类和派生类

1. 基类和派生类的定义

 从一个类派生出另一个类,原先的类称为基类,继承类称为派生类。
  • 1

派生类的定义方式:

class 派生类类名: 访问权限修饰符 基类类名1, 访问权限修饰符 基类类名2, ...
{
	//成员列表
}
  • 1
  • 2
  • 3
  • 4

例子:

class Base1
{
  //...
};
class Base2
{
  //...
};
class Derived: public Base1, protected Base2
{
  //...
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. 派生类和基类的访问关系

  1. 基类中的成员函数可以访问基类的所有成员,但不能访问派生类的成员。
  2. 基类的对象只能访问基类的公有数据成员和调用基类的公有成员函数,基类对象不能访问派生类的成员。
  3. 派生类中的成员函数可以访问派生类的所有成员,也可以访问其基类的公有成员和受保护成员。
  4. 派生类的对象能访问派生类的共有数据成员和调用派生类的公有数据成员,公有继承的派生类对象还能够访问其基类的公有成员。

3. 派生类对象对成员函数的调用

    用公有继承的派生类对象名调用成员函数:

  • 若被调用的成员函数在基类中无定义,是派生类新增的成员函数,则调用派生类相应的成员函数
  • 被调用的成员函数从基类继承而来,且在派生类中没有重新定义,则调用基类相应的成员函数。
  • 被调用的成员函数从基类继承而来,但在派生类中被重新定义,此时,如果派生类中与调用函数同名的成员函数参数匹配,则该成员函数被调用,否则返回出错信息。编译程序不会再在基类中查找匹配的成员函数。

3.1 派生类对象的存储

4. 派生类的构造

构造一个派生类包括以下3部分工作:

1)从基类接受成员
     派生类把基类全部的成员(不包括构造函数和析构函数)接收过来,也就是说是没有选择的,不能选择接受其中一部分成员,而舍弃另一部分成员。
  要求我们根据派生类的需要慎重选择基类,使冗余量最小。事实上,有些类是专门作为基类而设计的,在设计时充分考虑到派生类的要求。
2)调整从基类接收的成员
    接收基类成员是程序人员不能选择的,但是程序人员可以对这些成员作某些调整。
3)在声明派生类时增加的成员
    这部分内容时很重要的,它体现了派生类对基类功能的扩展。

    此外,在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承来的。

4.1 派生类的构造函数

  • 派生类构造函数功能应该包含对从基类继承过来的继承成员的初始化;派生类析构函数功能应包含从基类继承过来的继承成员的撤销。
  • 派生类并不继承基类的构造函数和析构函数,而派生类构造函数必须为基类的构造函数提供实际参数。
  • 若一个类没有定义构造函数时,C++编译会自动为该类生成一个缺省的构造函数,但函数体为空。用这样的类创建对象时,其对象的状态将时不确定的。

1. 派生类对象的成员组成:
-从基类继承过来的继承成员
-新加入的成员
2. 派生类构造函数构成:
-调用基类构造函数,对继承成员进行初始化
-按常规方法对新加入的数据成员初始化
3. 派生类构造函数的执行:
-先调用基类的构造函数对继承成员进行初始化
-再执行对新加成员初始化的部分。
4.若基类构造函数带有参数,定义派生类构造函数时必须在初始化列表中显示调用基类构造函数,并用在派生类构造函数的形参部分为基类构造函数提供实参。
-即便派生类本身的构造函数不带参数也必须在冒号后调用基类的构造函数,但这是传递给基类构造函数的实参通常时一些常量表达式。
5.若基类构造函数不带参数,定义派生类构造函数时,可以不必显示的调用基类构造函数(C++编译程序认为已自动调用了基类中形式参数列表为空的构造函数。无参数的构造函数可以是C++程序自动产生的,也可以是程序员自己声明/定义的)。

派生类构造函数一般的定义格式为:
    派生类名::派生类名(基类所需形参,派生类成员所需形参,对象成员形参):基类名(基类的参数),<对象成员名>(对象成员的参数)
{
    派生类成员初始化赋值语句;
}

4.2 派生类构造函数的调用顺序

  • 派生类构造函数的调用顺序如下:
    -根据派生类定义顺序依次调用基类构造函数对基类数据成员初始化
    -对象数据成员类的构造函数(如果由对象数据成员的话)
    -派生类构造函数体内的代码

4.3 派生类的析构函数

  • 析构函数也不能被继承,因而当派生类对象撤销,调用派生类的析构函数时,基类的构造函数也将自动隐式地被调用以释放基类数据成员所占用的资源
  • 派生类析构函数的执行顺序与派生类构造函数的调用顺序正好相反:
    -派生类析构函数
    -子对象数据成员类的析构函数(如果有子对象数据成员的话)
    -基类的析构函数

5. 类型兼容性

  • 赋值运算的类型兼容性
    -可以将派生类的对象赋值给基类,反之,在默认的情况下不可以
    -每个派生类对象包含一个基类部分,这意味着可以将派生类对象当作基类对象来使用
    -指向基类对象的指针也可指向公有派生类对象
    -此规则只适用于公有派生,即:只有公有派生类才能兼容其基类类型
  • 参数传递与对象初始化的类型兼容性
    -与赋值运算的类型兼容性相同
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/106004?site
推荐阅读
相关标签
  

闽ICP备14008679号