封装可以使得代码模块化(是基础
),继承可以扩展已存在的代码(是关键
),而多态的目的则是为了接口重用(是补充
)
封装
封装是将数据(成员变量)和操作这些数据的函数(成员函数)结合在一起,形成一个单元。封装的核心是访问控制,通过使用访问修饰符(如 public
、protected
和 private
)来限制外部对类内部数据和实现的直接访问。
通过封装,隐藏了类的实现细节和成员数据,实现了代码模块化。用户只需关注对象的接口,而不是其内部实现,从而提高了代码的可靠性和可维护性。
class Box {
private: double length; // 成员变量,只能在类内部访问
public: void setLength(double len) { // 成员函数,允许外部访问 length = len; } double getLength() { return length; }
};
继承
继承是实现类之间关系的一种机制,可以通过继承派生出新类(子类),从已有的类(基类)中获取成员变量和成员函数。继承支持代码重用和逻辑组织,使得建立层次化的类结构成为可能。
C++ 中的继承可以是单继承(一个类继承自一个基类)或多继承(一个类可以继承自多个基类)。
通俗点说:就是子类继承父类,获得父类中实现的功能,并且还可以进行扩展。
class Shape {
public: void draw() { // 绘制图形的代码 }
}; class Rectangle : public Shape { // Rectangle 继承自 Shape
public: void draw() { // 绘制矩形的代码 }
};
多态
多态分为:静态多态和动态多态,静态多态:在编译期间就可以确定的多态 例如:函数重载和运算符重载和模板,函数重载在编译期间通过实参的类型能确定调用哪个函数
动态多态:在运行期间确定的多态,父类指针或引用指向子类对象,在通过父类指针调用虚函数的时候,父类指针会通过对象里面的虚表指针找到虚表,然后在虚表中确定虚函数的地址进行调用(流程)
多态是指同一操作在不同对象上可以表现出不同的行为。在 C++ 中,多态通过函数重载和虚函数实现。
总结:父类指针或引用指向子类对象
class Animal {
public: virtual void sound() { // 虚函数 cout << "Animal sound" << endl; }
}; class Dog : public Animal {
public: void sound() override { // 重写基类的虚函数 override关键字明确表明将会重写父类的虚函数cout << "Bark" << endl; }
}; void makeSound(Animal* animal) { animal->sound(); // 运行时多态
} Dog dog;
makeSound(&dog); // 输出 "Bark"
函数重写:子类重新定义父类中有相同名称,返回值和参数的虚函数主要在继承关系中出现