初始面向对象之继承
根据面向对象的编程思路,我们可以把共性抽象出来封装成类,然后让不同的角色去继承这些类,从而避免大量重复代码的编写
实现继承
继承机制是面向对象程序设计中使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,添加功能,这样产生的新类叫做子类(派生类),被继承的类型称为父类(基类)
格式
class 派生类名:继承方式 基类名1,继承方式 基类名2,....
{
派生类成员;
};
继承方式有: public,protrcted,private
class Houyi:public Hero,pulbic Ranger{
public:
Houyi(const string &name,int distance,int looks);
~Houyi();
void show() const;
private:
int looks; // 颜值
}
此时的Houyi这个类继承了Hero和Ranger两个类,拥有了Hero和Ranger的所有成员
构造函数的调用顺序:先按照继承时的顺序挨个调用基类的构造函数,然后调用派生类的构造函数
析构函数调用顺序和构造函数调用顺序相反
某个类的私有成员属性只能在该类中使用, 如果想在派生类中使用,就必须对外提供一个公共的方法。
组合
组合是对现有对象进行拼装即组合产生新的具有更复杂功能的类,组合强调的是整体与部分的关系,它们之间有明显的“has a”关系
class 类名{
public :
成员函数;
private :
类1 对象1;
类2 对象2;
};
构造函数的调用顺序:
1.按照继承时的顺序挨个调用基类的构造函数
2.调用对象成员的构造函数
3.调用派生类的构造函数
继承的优缺点
继承是一种 “is-a” 的关系,例如 Student 继承 Person,说明 Student 是 Person。
优点: 方法复用: 子类可以复用父类的方法,并在需要时重写(override)父类的方法,方便地实现对父类的扩展。
缺点: 细节可见性: 父类的内部细节对子类是可见的,违反了信息隐藏原则。
编译时绑定: 子类继承的父类方法在编译时确定,无法在运行时改变父类方法的行为。
高耦合: 如果父类的方法更改(例如增加参数),子类必须进行相应的修改,导致子类与父类高度耦合,违反了低耦合原则。
组合的优缺点
组合是一种 “has-a” 或 “contains-a” 的关系,例如一个 Car 包含一个 Engine 对象。
在类设计时,通过将一 个类的对象作为另一个类的成员变量来实现组合。
优点:
低耦合: 当前对象与包含对象的内部细节分离,只通过其公开接口进行交互,降低耦合度。
运行时动态绑定: 当前对象可以在运行时动态绑定所包含的对象,可通过 set 方法进行对象赋值。
灵活性高: 可以将不同的对象组合在一起,从而灵活地设计系统。
缺点:
对象数量增多: 组合可能会产生大量对象,增加内存使用和管理复杂性。
接口设计复杂: 为了组合多个对象,需要仔细设计和定义接口,以确保类之间的协同工作。
修饰权限
类成员的修饰权限
继承方式