1. 抽象(Abstraction)
用法示例:
假设我们要为一个学校信息系统设计一个Student
类,我们只需要关注学生的基本属性(如姓名、学号)和行为(如注册课程),而不必关心学生的具体个人信息细节。
class Student {
public:
// 构造函数,初始化基本信息
Student(std::string name, int id) : name(name), studentID(id) {}
// 行为示例:注册课程
void enrollCourse(const std::string& courseName) {
courses.push_back(courseName);
}
private:
std::string name; // 学生姓名
int studentID; // 学号
std::vector<std::string> courses; // 已注册课程列表
};
2. 封装(Encapsulation)
用法示例:
在上面的Student
类中,我们可以使用私有(private)访问修饰符来隐藏数据成员(如姓名和学号),并通过公共(public)成员函数暴露安全的操作接口。
class Student {
private:
std::string name;
int studentID;
public:
// 使用公有的getter和setter方法来封装数据
std::string getName() const { return name; }
void setName(const std::string& newName) { name = newName; }
int getStudentID() const { return studentID; }
// 注意:实际应用中,学号一般不会允许修改,这里仅作示例
void setStudentID(int newID) { studentID = newID; }
// 其他成员函数...
};
3. 继承(Inheritance)
用法示例:
假设我们要扩展学生类型,增加一个GraduateStudent
(研究生)类,它除了具有普通学生的基本属性和行为外,还额外拥有导师信息和研究方向。这时可以使用继承来复用Student
类的代码。
class GraduateStudent : public Student {
public:
GraduateStudent(std::string name, int id, std::string advisor, std::string researchArea)
: Student(name, id), advisor(advisor), researchArea(researchArea) {}
// 添加特有的属性和行为
std::string getAdvisor() const { return advisor; }
std::string getResearchArea() const { return researchArea; }
private:
std::string advisor; // 导师姓名
std::string researchArea; // 研究方向
};
4. 多态(Polymorphism)
用法示例:
多态允许我们使用基类指针或引用指向派生类对象,并通过虚函数调用实际子类的实现。以Person
基类和Student
、Teacher
派生类为例,展示多态的用法。
class Person {
public:
virtual ~Person() {} // 虚析构函数,确保正确释放派生类资源
virtual void introduce() const = 0; // 纯虚函数,强制派生类实现
};
class Student : public Person {
public:
void introduce() const override {
std::cout << "I am a student." << std::endl;
}
};
class Teacher : public Person {
public:
void introduce() const override {
std::cout << "I am a teacher." << std::endl;
}
};
// 使用多态
void introducePerson(const Person& p) {
p.introduce();
}
int main() {
Student s("Alice", 123);
Teacher t("Bob");
introducePerson(s); // 输出 "I am a student."
introducePerson(t); // 输出 "I am a teacher."
return 0;
}