【C++】面向对象的三大特性
面向对象编程三大核心特性:封装、继承和多态。
1. 封装
封装指的是将数据和操作这些数据的方法绑定在一起,形成一个对象,并且隐藏对象的内部实现细节,只暴露必要的接口。封装的目的是保护数据,确保外部代码不能直接访问对象的内部状态,只有通过对象提供的方法才能与数据交互。
class Person {
private:
int age; // 仅在类内部访问
public:
void setAge(int a) { // 通过方法设置数据
if (a >= 0) age = a;
}
int getAge() { // 通过方法获取数据
return age;
}
};
2. 继承
继承允许一个类从另一个类中继承属性和方法。通过继承,子类能够复用父类的代码,并且可以对父类的方法进行扩展和修改。
-
优势:
- 代码复用:子类继承父类后,能够使用父类的已有功能,避免重复编写相同的代码。
- 可扩展性:子类可以在继承的基础上增加新的功能或修改父类的行为。
class Animal {
public:
void eat() {
std::cout << "Eating...\n";
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << "Barking...\n";
}
};
Dog dog;
dog.eat(); // 从Animal继承的方法
dog.bark(); // Dog类的方法
3.多态
多态是指同一操作作用于不同的对象上,可以表现出不同的行为。多态可以通过方法重载(函数签名不同)和方法重写(子类修改父类方法的实现)来实现。
优势:
- 提高了代码的灵活性和可维护性,程序在运行时可以决定调用哪个版本的函数。
- 通过多态可以写出更加通用和可扩展的代码,减少了冗余。
class Shape {
public:
virtual void draw() { // 虚函数,允许子类重写
std::cout << "Drawing a shape\n";
}
};
class Circle : public Shape {
public:
void draw() override { // 重写父类的方法
std::cout << "Drawing a circle\n";
}
};
class Square : public Shape {
public:
void draw() override { // 重写父类的方法
std::cout << "Drawing a square\n";
}
};
void drawShape(Shape* shape) {
shape->draw(); // 根据传入的具体类型调用不同的draw方法
}
int main() {
Shape* shape1 = new Circle();
Shape* shape2 = new Square();
drawShape(shape1); // 输出: Drawing a circle
drawShape(shape2); // 输出: Drawing a square
return 0;
}
总结:
- 封装:通过隐藏实现细节和暴露接口来保护数据,确保对象的内部状态不被随意修改。
- 继承:子类可以继承父类的属性和方法,复用代码并扩展功能。
- 多态:同一接口可以根据不同对象表现出不同的行为,提高了代码的灵活性和扩展性。