面向对象特征(抽象、封装、继承、多态)的具体用法

简介: 面向对象特征(抽象、封装、继承、多态)的具体用法

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基类和StudentTeacher派生类为例,展示多态的用法。

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;
}


目录
相关文章
|
安全 计算机视觉 Python
最全 Python 知识框架总结,一图看懂!
最全 Python 知识框架总结,一图看懂!
252 0
|
数据挖掘
基于PaddlePaddle的中风患者线性模型预测
基于PaddlePaddle的中风患者线性模型预测
116 0
|
9月前
|
存储 监控 安全
实时记录和查看Apache 日志
Apache 是一个开源、跨平台的Web服务器,保护其安全依赖于监控活动和分析访问日志。日志分为访问日志和错误日志,前者记录用户请求及响应情况,后者记录服务器错误信息。EventLog Analyzer等工具可集中收集、分析日志,提供直观的仪表板和实时警报,帮助识别趋势、异常和威胁,确保服务器稳定性和安全性,并支持合规管理。
217 5
|
机器学习/深度学习 算法 开发工具
大语言模型的直接偏好优化(DPO)对齐在PAI-QuickStart实践
阿里云的人工智能平台PAI,作为一站式的机器学习和深度学习平台,对DPO算法提供了全面的技术支持。无论是开发者还是企业客户,都可以通过PAI-QuickStart轻松实现大语言模型的DPO对齐微调。本文以阿里云最近推出的开源大型语言模型Qwen2(通义千问2)系列为例,介绍如何在PAI-QuickStart实现Qwen2的DPO算法对齐微调。
|
网络协议 JavaScript 安全
深入浅出TCP 与 UDP
深入浅出TCP 与 UDP
208 0
|
JSON 前端开发 数据格式
关于JWT令牌和过滤器以及拦截器的实现流程
JWT令牌用于验证用户请求合法性,登录时通过Filter或Interceptor校验账号密码,生成JWT并返回给前端保存。请求时,后端通过解析令牌检查其完整性、时效性和合法性。Filter在请求处理前检查是否携带JWT,Interceptor的preHandle方法同样用于此目的。两者选择其一即可,拦截器配置更精确但稍复杂。
|
关系型数据库 数据库 PostgreSQL
|
存储 Oracle 关系型数据库
MySQL8 中文参考(二十九)(2)
MySQL8 中文参考(二十九)
355 9
|
SQL 数据库 数据安全/隐私保护
harbor修改密码
在Harbor `v2.9.0`中,忘记密码可使用以下方法强制重置:通过`docker exec`进入harbor-db容器,使用SQL命令`update harbor_user set salt=&#39;&#39;,password=&#39;&#39; where user_id = 1;`清空admin密码。然后重启Harbor,系统将要求初始化新密码。注意此操作涉及数据库交互,需谨慎执行。
1251 0
|
SQL 消息中间件 JavaScript
权限系统中的数据权限就该这么设计,yyds!
权限系统中的数据权限就该这么设计,yyds!

热门文章

最新文章