langShift

面向对象编程基础

面向对象编程 (OOP) 是一种基于“对象”概念的编程范式,对象可以包含数据和代码。C++ 是一种多范式语言,对 OOP 有强大的支持,而 JavaScript 使用基于原型的对象模型。

类和对象定义

在 C++ 中,是创建对象的蓝图,为状态(成员变量)提供初始值,并实现行为(成员函数)。对象是类的一个实例。

正在加载...

构造函数和析构函数

构造函数是对象创建时自动调用的特殊成员函数。它们用于初始化对象的状态。

析构函数是对象销毁时(超出作用域或被 delete)自动调用的特殊成员函数。它们用于清理资源(例如,释放动态分配的内存)。

正在加载...

封装和访问控制

封装是将数据(成员变量)和操作数据的方法(成员函数)捆绑到一个单元(类)中,并限制对对象某些组件的直接访问。这通过访问修饰符实现:

  • public:成员可从任何地方访问。
  • private:成员只能从类内部访问。
  • protected:成员可从类内部和派生类访问。
正在加载...

基本继承

继承是一种机制,其中从现有类(基类或超类)创建新类(派生类或子类)。派生类继承基类的属性和行为,促进代码重用。

正在加载...

多态概念

多态(意为“多种形式”)允许不同类的对象被视为共同基类的对象。在 C++ 中,多态主要通过虚函数指向基类的指针/引用实现。

正在加载...

与 JavaScript 原型链的比较

JavaScript 的对象模型是基于原型的,而不是传统意义上的基于类(尽管 ES6 类提供了语法糖)。当你尝试访问对象上的属性或方法时,JavaScript 会首先直接在对象上查找。如果找不到,它会在对象的原型上查找,然后在原型的原型上查找,依此类推,形成一个原型链

主要差异:

  • 继承模型: C++ 使用经典继承(基于类),而 JavaScript 使用原型继承。
  • 显式 vs. 隐式: C++ 继承是显式的,带有 classpublic/private/protected 等关键字。JavaScript 的原型继承更隐式。
  • 多态: C++ 依赖虚函数和基类指针/引用来实现运行时多态。JavaScript 由于其动态特性和原型链而自然实现多态。

虚函数机制

在 C++ 中,虚函数是在基类中声明并由派生类重新定义(覆盖)的成员函数。当你通过指向基类的指针或引用调用虚函数时,执行哪个特定版本的函数是在运行时根据所指向或引用的对象的实际类型确定的。这称为动态分派运行时多态

  • virtual 关键字: 声明一个函数为基类中的虚函数。
  • override 关键字 (C++11): 可选,但在派生类中是个好习惯,用于指示函数旨在覆盖基类中的虚函数。如果签名不匹配,有助于捕获错误。
  • 虚表 (vtable): 编译器通常使用虚表来实现虚函数,虚表是函数指针的查找表。

练习题:

  1. 解释 C++ 中封装和继承的概念。访问修饰符 (publicprivateprotected) 如何与封装相关?
  2. C++ 中的多态是什么,以及如何使用虚函数实现它?提供一个简单的 C++ 代码示例,演示运行时多态。
  3. 比较和对比 C++ 的基于类的继承与 JavaScript 的基于原型的继承。它们在实现面向对象原则方面的主要差异是什么?

项目构想:

  • 使用继承和多态在 C++ 中设计并实现一个简单的 Shape 层次结构。创建带有虚函数 calculateArea() 的基类 Shape。从 Shape 派生 CircleRectangle 类,每个类都覆盖 calculateArea() 以提供其特定的实现。然后,创建一个 Shape 指针数组,并演示对不同形状多态地调用 calculateArea()