c++——派生类和基类转换(类型兼容性原则)

基类也叫父类,派生类也叫子类。

类之间的继承关系
继承关系是类之间的父子关系。 继承关系的特点如下:
A、 子类拥有父类的所有属性和行为
B、 子类也是一种特殊的父类
C、 子类对象可以当父类对象使用
D、 子类中可以添加父类没有的属性和方法
E、 子类对象可以直接初始化父类对象
F子类对象可以直接赋值给父类对象
G、 继承是面向对象编程中代码复用的重要手段

H、父类指针可以直接指向子类对象
 I、父类引用可以直接引用子类对象

C++编程中, 软件可重用性(software reusability)是通过继承(inheritance)
制来实现的。 类的继承, 是新的类从已有类得到已有的特性。 从已有类产生新类
的过程就是类的派生。原有的类称为基类或父类, 产生的新类称为派生类或子类。
继承是一种封装模型之间关系的抽象, 是不同封装模型的层次分类。

如果一个派生类同时有多个基类, 称为多重继承; 如果派生类只有一个基类,称为单继承。

使用 class 关键字定义派生类时, 默认继承方式为 private
使用 struct 关键字定义派生类时, 默认继承方式为 public
C++工程项目中, 通常只使用 public 继承方式。

派生类中的成员包含两大部分, 一类是从基类继承过来的, 一类是自己增加
的成员。 从基类继承的成员表现其共性, 而新增的成员体现其个性。
派生类中由基类继承而来的成员的初始化工作还是由基类的构造函数完成,
然后派生类中新增的成员在派生类的构造函数中初始化。 派生类没有继承基类的
构造函数和析构函数。

派生类经常(但不总是)覆盖它继承的虚函数。如果派生类没有覆盖其基类中的某个虚函数,则该虚函数的行为类似于其他的普通成员,派生类会直接继承其在基类中的版本。

c++11允许派生类显式地注明它使用某个成员函数覆盖了它继承的虚函数。具体做法是在形参列表后面、或者在const成员函数的const关键字后面、或者在引用成员函数的引用限定符后面添加一个关键字override。

派生类也必须使用基类的构造函数来初始化它的基类部分。(除非基类没有显式定义构造函数,这样在派生类的构造函数中可以不显式调用基类的构造函数)

我们可以把公共派生类当做基类使用,派生类可以赋值给基类,基类的引用或者指针可以绑定到派生类上(反之不行)。

遵循基类的接口:

尽管在语法上来说我们可以在派生类构造函数体内给它的共有或者受保护的基类成员赋值,但是最好不要这么做。和使用基类的其他场合一样,派生类应该遵循基类的接口,并通过调用基类的构造函数来初始化那些从基类中继承而来的成员。

如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义。不论基类中派生出来多少个派生类,对于每个静态成员都只存在唯一的实例。静态成员也要遵循通用的访问控制规则,public,private,protected。

如果我们想要将某个类用作基类,则该类必须是已经定义了的而不能仅仅声明。这意味着,一个类不能派生它本身。

有时候我们会定义这样一种类,我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类,为了实现这一目的,c++11提供了一种防止继承发生的方法,即在类名后跟一个关键字final。我们还能把某个函数指定为final,则之后任何尝试覆盖该函数的操作都将引发错误。

eg:

class A final { ....};//A不能作为基类

当我们用一个派生类对象为一个基类对象初始化或者赋值时,只有该派生类对象中的基类部分会被拷贝、移动或赋值,它的派生部分会被忽略掉。

如果表达式既不是指针也不是引用,那么它的动态类型永远与静态类型一致,如果是指针或者引用,将产生动态绑定,动态类型直到运行时才可知,而静态类型在编译时就总是已知的。

原文地址:https://www.cnblogs.com/yangguang-it/p/6502267.html