[总结]C++真是博大精深(三)

来源:互联网 发布:c语言和指针 编辑:程序博客网 时间:2024/05/24 00:11

派生类与继承

(最终解释权归原文作者所有,侵权必究)

1、继承是面向对象编程的重要特征之一,通过继承,可以实现代码重用。在C++中,继承就是利用已有的类,通过派生的方式产生新的类。新类不但继承了已有类的属性和方法,而且可以增加新的属性和方法。

2、在C++中,可以在已有类的基础上构建新类,这个新类继承了已有类的属性和方法。这个新定义的类称为原有类的派生类或子类,而原有类称为新定义类的基类或父类。派生类可以增加新的属性和方法。

3、保护数据成员可以被本类及其派生类的成员函数直接访问,但不能被外部对象直接访问。protected成员的开放特性介于private成员和public成员之间。

4、派生类的定义方法:派生类继承了基类的所有属性和方法,根据需要,派生类还会增加自己所特有的属性和方法。派生类定义的语法形式为:class 派生类名:派生方式 基类名{……};

5、派生方式的三种类型:public、protected和private,对于不同的派生方式,其访问控制约束不同。

基类中的访问属性

派生方式

public

protected

private

public

public

protected

private

protected

protected

protected

private

private

private

private

private

6、派生类的数据成员包括从基类继承而来的数据成员和派生类新增的数据成员。构造函数、复制构造函数、析构函数和赋值操作符不能被继承。为了对派生类新增的数据成员和基类数据成员进行初始化,需要为派生类定义构造函数。在派生类对象生命周期结束时,派生类的析构函数被自动调用。可通过该析构函数完成派生类中所分配内存的清理工作和数据保存工作。

7、派生类对象通过构造函数进行初始化时,为完成继承自基类的数据成员的初始化,要调用其基类构造函数。派生类构造函数的定义形式为:派生类名(形参声明):基类名(参数表){派生类新增加的初始化语句},其中,传给基类构造函数的参数,可以来自于派生类构造函数的形参,也可以使用常数值。

  当创建一个派生类对象时,首先执行基类的构造函数,然后再执行派生类的构造函数。当基类中没有显式定义构造函数,或者基类中构造函数没有参数,或者基类构造函数的所有参数均使用默认参数时,不需要通过派生类构造函数向基类构造函数传递参数。

8、在派生类中,可以根据需要,显式地定义析构函数。在执行派生类的析构函数时系统会自动调用基类的析构函数,从而完成基类对象的清理工作。派生类和基类析构函数的执行顺序与构造函数的执行顺序相反,即先执行派生类的析构函数,再执行基类的析构函数。如果在派生类中没有显式地定义析构函数,那么系统会创建一个默认析构函数。

9、当派生类中含有对象成员的话,通常也需要通过派生类的构造函数对其进行初始化。

  ⑴先执行基类的构造函数,再执行对象成员的构造函数,最后执行派生类构造函数的函数体。在对象撤销时,析构函数的执行顺序与构造函数的执行顺序正好相反。

  ⑵当派生类中有若干个对象成员时,通常,其构造函数的定义形式为:派生类名(形参声明):基类名(参数表0),对象成员1(参数表1)……{ 对派生类新增数据成员的初始化 }

  ⑶如果派生类的基类是另一个类的派生类,那么,每个派生类通常只负责其直接基类的数据成员的初始化。

10、在C++中,派生类成员的名字可以与基类成员的名字相同,这些名字相同的成员称为同名成员。在这种情况下,在派生类使用该名字意味着访问在派生类中重新说明的成员。如果要在派生类中使用基类中的同名成员,则必须在该同名成员前加上基类名和作用域运算符::。如果想通过派生类的对象访问基类中的同名成员,也要在同名成员名前加上基类名和作用域运算符::。

11、在C++中,以public方式继承的派生类可以看成是其基类的子类型。赋值兼容规则是指在需要基类对象的任何地方都可以使用子类型队形来替代。通过公有继承,派生类继承了基类中除构造函数]析构函数以外的所有非私有成员,而且这些成员的访问控制属性也与基类成员完全相同。这样,公有派生类具有了基类的所有特性,凡是基类能够解决的问题,派生类也能解决。

12、如果派生类只有一个直接基类,称为单继承。具有两个或两个以上直接基类的继承关系称为多继承。

⑴多继承派生类的定义形式为:class 派生类名:派生方式1 基类名1,派生方式2 基类名2……{…};

⑵多继承派生类构造函数的定义形式为:派生类名(形参声明):基类名1(参数表1),基类名2(参数表2)……{对派生类新增数据成员的初始化};

⑶在定义和使用多继承派生类时,有时会产生二义性问题。明确指出调用哪一个副本的成员,可以避免二义性。

13、虚基类在派生类中说明:class 派生类名:virtual 派生方式 基类名{……};virtual关键字也可以写在派生方式关键字的后面。虚基类的成员在其派生类中只会出现一个副本,避免了二义性。

⑴如果虚基类中定义了带形参的构造函数,而且没有定义默认构造函数,那么该虚基类所有直接或间接的派生类都必须在其构造函数定义中给出对虚基类构造函数的调用。

⑵虚基类数据成员的初始化是由其最远派生类的构造函数对虚基类构造函数的调用来完成的。该派生类的其他基类对虚基类构造函数的调用会被自动忽略。

⑶基类在作为某些类的虚基类时,还可以同时作为另一些类的一般基类。

原创粉丝点击