面向对象编程(Object-oriented Programming,简称OOP)是一种编程范式,它的核心概念是将数据和方法封装成对象,通过对象之间的交互来完成程序的功能。在C/C++中,OOP的三个基本特性分别是封装、继承和多态。本文将介绍这三个特性的具体使用方法。
1. 封装
封装是OOP中的基本概念,它通过将数据和相关的操作方法封装在一个对象中,对外部隐藏了其内部的细节。C++中的封装通过类来实现,而C则通过定义结构体来实现。
示例:
class Circle {
private:
double radius;
public:
void setRadius(double r) {
radius = r;
}
double getRadius() {
return radius;
}
double getArea() {
return 3.14 * radius * radius;
}
};
在上面的示例中,Circle
类封装了一个半径属性以及与此属性相关的操作方法。属性radius
被设置为private
,因此只能通过setRadius
方法来设置半径的值,并通过getRadius
方法获取其值。这样就有效地隐藏了Circle
类内部的细节,使用户只能通过公共方法来访问类的属性和方法。
2. 继承
继承是OOP中实现类之间代码共享和代码复用的机制。通过继承,一个类可以从另一个类派生出来,并继承其属性和方法。C++中支持单继承和多继承,单继承是指一个类只能从一个类派生出来,而多继承是指一个类可以从多个类派生出来。
示例:
class Shape {
protected:
double width;
double height;
public:
Shape(double w, double h) {
width = w;
height = h;
}
virtual double getArea() = 0;
};
class Rectangle : public Shape {
public:
Rectangle(double w, double h) : Shape(w, h) { }
double getArea() override {
return width * height;
}
};
class Triangle : public Shape {
public:
Triangle(double w, double h) : Shape(w, h) { }
double getArea() override {
return width * height / 2;
}
};
在上面的示例中,Shape
类是一个抽象类,通过virtual
关键字声明了纯虚函数getArea()
。Rectangle
和Triangle
类继承自Shape
类,并重写了getArea()
方法。通过继承的方式,Rectangle
和Triangle
类可以直接使用Shape
类中定义的属性和方法,并且可以根据需要进行自定义扩展。
3. 多态
多态是指同一操作根据不同的对象会产生不同的行为。C++通过虚函数(virtual function)实现多态。虚函数是在基类中声明的函数,在派生类中可以根据需要进行重写。通过将基类指针指向派生类对象,可以实现在运行时根据对象的具体类型调用对应的方法。
示例:
class Shape {
public:
virtual double getArea() = 0;
};
class Rectangle : public Shape {
public:
double getArea() override {
return 5.0;
}
};
class Triangle : public Shape {
public:
double getArea() override {
return 10.0;
}
};
int main() {
Shape* s1 = new Rectangle();
Shape* s2 = new Triangle();
cout << s1->getArea() << endl; // 输出 5.0
cout << s2->getArea() << endl; // 输出 10.0
delete s1;
delete s2;
return 0;
}
在上面的示例中,Shape
类中的getArea()
方法是一个虚函数。Rectangle
和Triangle
类继承自Shape
类,并重写了getArea()
方法。在main()
函数中,通过基类指针分别指向Rectangle
和Triangle
对象,然后通过调用getArea()
方法,实现了多态的效果。
结论
封装、继承和多态是面向对象编程中非常基础和重要的概念。C/C++提供了丰富的语法和机制来支持这三个特性的实现。通过合理地运用封装、继承和多态,我们可以使程序的设计更加模块化和灵活,提高代码的可复用性和可维护性。
本文来自极简博客,作者:笑看风云,转载请注明原文链接:C/C++面向对象编程实践