C++ 语言特性
- C 是一种过程化编程语言,主要用于系统编程和嵌入式系统。
- C++ 是一种面向对象编程语言,支持面向对象编程、泛型编程和过程化编程。
- C++ 具有类、继承、多态、封装等面向对象特性,而 C 没有这些特性。
- C++ 提供了函数重载、运算符重载和模板等功能,而 C 没有。
封装、继承、多态的定义
- 封装:
- 封装通过类来实现,将数据和操作数据的方法绑定在一起,并隐藏实现细节。
-
使用访问控制符(如
private
、protected
和public
)来控制对类成员的访问。 -
继承:
- 继承允许一个类从另一个类继承成员变量和方法,实现代码重用和扩展。
-
支持单继承和多继承(一个类可以继承多个基类)。
-
多态: 分为
- 编译时多态(静态多态):
- 通过函数重载和运算符重载实现。
- 在编译时确定函数调用。 和
- 运行时多态(动态多态):
- 通过基类指针或引用调用派生类的虚函数实现。
- 在运行时通过虚函数表(vtable)和虚函数指针(vptr)确定函数调用。
解决的问题
1、数据和操作的耦合性强,数据易于被随意修改,缺乏安全性和控制。 2、代码重复,不同类之间缺乏共享机制,难以维护和扩展。 3、代码灵活性不足,不同类型对象的操作方式不统一,难以实现通用接口和灵活调用。
应用
具体来说怎么做呢~
封装的属性/函数实现
类的私有属性,应该通过一个公有方法对外;
多态的实现
多态通过基类的指针或引用指向派生类对象,并通过虚函数机制来实现。在运行时,根据实际对象类型调用相应的重写方法。
Copy code
#include <iostream>
using namespace std;
// 基类
class Shape {
public:
virtual void draw() {
cout << "Drawing shape..." << endl;
}
};
// 派生类
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing circle..." << endl;
}
};
class Square : public Shape {
public:
void draw() override {
cout << "Drawing square..." << endl;
}
};
// 函数接收基类指针,实现多态
void drawShape(Shape* shape) {
shape->draw();
}
int main() {
Shape* c = new Circle();
Shape* s = new Square();
drawShape(c); // 调用 Circle 的 draw 方法
drawShape(s); // 调用 Square 的 draw 方法
delete c;
delete s;
return 0;
}
在这个例子中,Shape 类定义了一个虚函数 draw,Circle 和 Square 类重写了这个方法。在 drawShape 函数中,通过基类指针 shape 调用 draw 方法,运行时会根据实际对象类型调用相应的 draw 方法,体现了多态性。