面向对象的三大特征
- 封装
- 目的:隐藏实现细节,实现模块化。
- 特性:
- 访问权限
public
:对所有对象开放。protected
:对子类开放。private
:只对自己开放。可以通过友元类打破private
限定。
- 对属性和方法进行限定。
class A {friend class B; // B 可以访问 c public:int a;void func(); protected:int b; private:int c; }
- 访问权限
- 继承
- 在无需修改基类的情况下通过继承实现对基类功能的扩展。
- 特性:
-
权限继承:基类成员在子类中的最高权限是什么。
基类成员访问权限 继承方式 基类成员在子类中的权限 public
protected
privatepublic public
protected
不允许public
protected
privateprotected protected
protected
不允许public
protected
privateprivate private
private
不允许 -
可以通过
using
来提高基类成员在子类中的权限,只能提高,不能降低。class Base { protected:void func() {std::cout << "Base func" << std::endl;} };class A: public Base { public:// 使用 using 声明提升访问级别using Base::func; };int main() {A a;a.func(); // 现在可以公开访问 funcreturn 0; }
-
支持多继承。
class B : public A {} class D : protected A {}class E : public A, B {}
-
支持接口继承(通过抽象类和纯虚函数实现)。
// 拥有至少一个纯虚函数的类称为抽象类。 // 抽象类不能被实例化,它主要用于定义子类应遵循的接口规范。 class IShape { public:virtual ~IShape() {} // 虚析构函数,保证派生类的析构函数被正确调用virtual void draw() const = 0; // 纯虚函数virtual double area() const = 0; // 纯虚函数 };
-
- 多态
- 目的:一个接口有多种形态,通过实现接口重用,增强可扩展性。
- 特性:
- 静态多态(编译期):函数重载(复用同一个函数名,改变函数参数。不包括修改函数的返回值类型,两个函数若只有返回值类型不同,则会编译报错)。
- 动态多态(运行时):虚函数重写(需要有继承