你所不知道的继承(一)

来源:互联网 发布:关于知止的事例 编辑:程序博客网 时间:2024/04/29 07:16

继承
继承是C++面向对象的的三种重要特征之一,他反应了人类认识事物的抽象思维方法和自然界中后代继承自祖先并产生变异的本质。C++通过支持继承来表达将成熟的软件单元引用到新软件的目的,及软件重用。利用继承可以对已存在的类进行特殊化而建立新类,从而使面向对象语言具有更强大的功能和丰富的表现力。
简单的来说继承就是由已有的类建立新类,新类会继承父类所有的属性和方法(包括静态和非静态成员但是不包括友元),而且子类也可以在父类的基础上添加一些属于自己的新功能。不过,相对于子类来时父类的一切都是不可改变的,所以为了适应新环境,子类可以有如下改变:
(1)重写父类的同名方法
(2)改变成员的属性
继承的基本语法如下:
eg1:

class Base{public:    Base()    {    }    void FunTest()    {    }    ~Base()    {    }private:    int date;};class Derive: public Base//派生类Derive公有继承于基类Base{};

派生类中共有三个访问权修饰符:1、public 2、protected 3、private

  1. public继承中派生类中基类的所有对象的属性都没有发生变化
  2. protected继承中基类public类的对象在派生类中降级为protected其他的不变
  3. private继承中基类的public和protected对象在派生类中都变为private

值得注意的一点是:不管是在什么继承中基类的私有对象和方法在派生类中都是不可见的,因为不能在类外对私有成员进行访问
小结:
1. 如果基类对象不想在类外访问,却可以在派生类中访问可以将其定义为protected
2. public继承表示的“是一个”,换句话说就是:派生类“是一个”基类。每一个父类可用的成员对子类同样可以使用,因为每一个子类对象也是父类的对象
3. protected和private继承表示“有一个”,基类中并非所有成员都是派生类接口的一部分
4. 使用关键字 class时的默认继承方式是private,而struct的默认继承方式是public
5. 在一般场合建议使用public继承


派生类中的默认成员函数:
要想知道派生类中的默认成员函数首先我们必须了解类的默认成员函数有哪些:

  • 构造函数
  • 拷贝构造函数
  • 析构函数
  • 赋值运算符重载函数
  • 取地址运算符重载函数
  • 被const修饰的取地址运算符函数
    在派生类中也是不例外,有以上这6个默认的成员函数,如果在派生类中没有显式的定义这些函数,那么编译器就会默认合成。
    编译器会合成默认构造函数的几种情况
  • 基类中有缺省的构造函数
  • 派生类中定义类对象而且类对象有自己的缺省构造函数
  • 虚拟继承
  • 抽象类(抽象类中有虚方法)的继承

继承关系中构造函数的调用顺序:
基类中的构造函数(按照继承列表的顺序调用)—>派生类中对象的构造函数(按照在派生类中成员对象的声明顺序调用)—>派生类中的构造函数
【注意】
- 若基类中没有缺省的构造函数,派生类必须要在初始化列表中显式的给出基类名和参数列表
- 若基类中没有定义构造函数,那么派生类中也可以不用定义,全部都使用缺省的构造函数
- 若基类中定义了有参数列表的构造函数,那么在派生类中就一定要定义构造函数
注释
缺省参数:顾名思义,缺省参数就是在函数声明的时候为其某一个参数指定一个默认的值,在之后的函数调用的时候如果不为那个参数给定值那么就会适应那么默认的值。<在定义缺省的参数时必须从最后一个参数开始而且缺省值只能是常量,如果想缺省一个参数那么他之后的所有参数必须都要给缺省值>
缺省构造函数:缺省构造函数又可以称为默认构造函数,当定义一个对象时,编译器会调用一个构造函数,若类中没有定义构造函数,那么编译器会自动调用默认的构造函数,该函数相当于一个不接受任何参数,不进行任何操作的构造函数。
继承关系中析构函数的调用顺序
首先需要强调的一点是析构函数的调用首先满足一个条件就是:就近原则
派生类的析构函数—>派生类中包含成员对象的析构函数(调用顺序和成员对象在类中的顺相反)—>基类的析构函数(调用顺序和基类在派生类中的声明顺序相反
作用域
- 值得一提的是:基类和派生类是属于两个不同的作用域所以不存在什么函数重载
- 若派生类中出现和基类同名的成员,那么派生类的成员将会覆盖基类的称为同名覆盖
- 建议在继承中不要出现同名的方法

1 0
原创粉丝点击