C++ 面向对象编程

ops/2024/12/22 14:58:50/

面向对象编程(Object-Oriented Programming, OOP)是C++语言的一个重要特性,它允许开发者以更直观和模块化的方式来设计和构建程序。OOP的四个主要原则是:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)和抽象(Abstraction)。

1、封装

封装是将数据和操作数据的方法绑定在一起,形成一个不可分割的整体(即对象)。通过封装,可以隐藏对象的内部实现细节,只对外暴露必要的接口。

C++ 的类一般定义在头文件里

Person.h

#pragma once
#include <string>
#include <iostream>
using namespace std;
class Person
{
protected:int number;string name;
public:void setNumber(int newNumber) {number = newNumber;}int getNumber() {return number;}void setName(string newName) {name = newName;}string getName() {return name;}void say() {cout << "hello";}
};

#pragma once 程序编译一次

private 修饰的变量为成员属性,成员属性只能通过get、set方法调用 

对象创建和方法调用

#include <string>
#include <iostream>
#include "Person.h"
using namespace std;void main() {Person stu;stu.setNumber(10);cout << stu.getNumber() << endl;stu.say();
}

2、继承

继承允许新的类(子类或派生类)继承现有类(父类或基类)的属性和方法。这有助于代码复用和扩展。

#pragma once
#include "Person.h"
class Student :public Person
{
private:double score;public:void setScore(double newScore) {score = newScore;}double getScore() {return score;}string toString() {return "[" + to_string(getNumber()) + ","+ getName() + "," + to_string(getScore())+"]";}};

Student类继承了Person基类

3、多态

多态允许将父类对象视为子类对象来处理,从而实现接口的动态绑定。C++中的多态通常通过虚函数(virtual function)来实现。

多态实现条件:

1)子类继承父类   

2)子类重写父类方法

3)子类向上转型 

父类Animal

class Animal
{
public:virtual void makeSound() {cout << "animal sound" << endl;}
};

子类 Dog ,并且实现父类方法

class Dog : public Animal
{
public:void makeSound() override{cout << "dog sound" << endl;}};

子类 Cat ,并且实现父类方法

class Cat : public Animal
{
public:void makeSound() override {cout << "cat sound" << endl;}
};

子类向上转型 

void playSound(Animal& animal) {animal.makeSound();
}int main() {Dog dog;Cat cat;playSound(dog); //输出 dog soundplaySound(cat); //输出 cat soundreturn 0;
}

makeSound函数在Animal类中声明为虚函数,并在DogCat类中重写。这使得playSound函数可以接收不同类型的Animal对象,并根据对象的实际类型调用相应的makeSound方法。

 4、抽象

抽象是指将复杂系统的实现细节隐藏起来,只暴露其接口或公共行为。在C++中,抽象通常通过抽象基类(包含纯虚函数的类)来实现。

class Shape
{
public:virtual void draw() = 0;//纯虚函数
};
class Circle : public Shape
{
public:void draw() override {cout << "drawing circle" << endl;}
};
class Square : public Shape
{
public:void draw() override {cout << "drawing square" << endl;}
};
int main() {Shape* shape1 = new Circle();Shape* shape2 = new Square();shape1->draw();shape2->draw();return 0;
}

Shape类是一个抽象基类,包含一个纯虚函数drawCircleSquare类继承自Shape类,并实现了draw方法。


http://www.ppmy.cn/ops/144048.html

相关文章

npm下载依赖相关命令

目录 一、基本命令 1.查看npm版本 2.升级npm 3.查看帮助 4.初始化项目 二、包管理命令 1.安装依赖 2.查看已安装的包 3.更新包 4.卸载包 5.查看包信息 6.搜索包 三、配置与发布命令 1.查看配置信息 2.设置配置信息 3.删除配置信息 4.登录npm 5.发布包 6.设…

flux模型的下载、配套及简易使用记录(ubuntu)

我在学习使用时&#xff0c;很迷惘各个模型放在什么 位置。以及他们的作用。所以系统的了解了一下。然后记录了&#xff0c;一下&#xff0c;希望能帮助到想了解这个知识的朋友。 另外&#xff0c;我将持续的更新这个专辑。记录我在学习和使用过程中关于comfy的方面。希望得到…

SEO初学者-搜索引擎如何工作

搜索引擎基础搜索引擎是如何建立索引的搜索引擎如何对网页进行排名搜索引擎是如何个性化搜索结果的 搜索引擎的工作方式是使用网络爬虫抓取数十亿个页面。爬虫也称为蜘蛛或机器人&#xff0c;它们在网络上导航并跟踪链接以查找新页面。然后&#xff0c;这些页面会被添加到搜索引…

为markdown导出的pdf添加页眉页脚

为Markdown导出的PDF添加页眉页脚 环境 vscode扩展&#xff1a;Markdown PDF 操作方式 快捷键 Ctrl, 打开设置搜索 “markdown-pdf”找到设置 页眉: Markdown-pdf: Header Template页脚: Markdown-pdf: Footer Template 页眉插入示例内容&#xff1a; 此处使用base64内嵌…

指令-v-for的key

在Vue.js中&#xff0c;v-for指令用于循环渲染数组或对象的元素。在使用v-for指令时&#xff0c;需要提供一个唯一的key属性来帮助Vue.js跟踪每个元素的身份&#xff0c;以便在更新渲染时能够正确地复用和删除元素。 key属性在v-for循环中的作用主要有两个方面&#xff1a; 帮…

前端入门之VUE--ajax、vuex、router,最后的前端总结

前言 VUE是前端用的最多的框架&#xff1b;这篇文章是本人大一上学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。本人不是学前端的&#xff0c;这个是大一的时候上学的和做的笔记&#xff0c;那个时候学的也蒙&#xff0c;故这里对前端做一个总…

【漫话机器学习系列】016.误差中的偏差(BIAS)

误差中的偏差&#xff08;Bias&#xff09; 在统计学和机器学习中&#xff0c;误差可被分解为三部分&#xff1a;偏差&#xff08;Bias&#xff09;、方差&#xff08;Variance&#xff09;和噪声&#xff08;Noise&#xff09;。其中&#xff0c;偏差描述了模型预测值与真实值…

线性代数判断两条线方向相反(python)

以下是几种可以通过线性代数相关知识来判断两条线方向相反的方法&#xff0c;以下假设两条线都是二维平面上的线段&#xff0c;线 a 的端点坐标为 (x1_a, y1_a) 和 (x2_a, y2_a) &#xff0c;线 b 的端点坐标为 (x1_b, y1_b) 和 (x2_b, y2_b) &#xff0c;对应你给出的示例中 x…