快来参与讨论?,点赞?、收藏⭐、分享?,共创活力社区。
目录
?前言
?封装
1.封装概念
2.封装格式
3.封装的原理
4.封装的作用
?继承
1.继承的概念
2.继承格式
3.继承的原理
4.继承的作用
?多态
1.多态的概念
2.多态的格式
3.多态的原理
4.多态的作用
?总结
?前言
?在 C++ 编程中,你是否曾对如何组织代码、实现代码复用以及处理不同对象的行为感到困惑?
?你是否渴望深入理解一些核心概念,从而能够更加高效地构建复杂的程序呢?
?如果你的答案是肯定的,那么 C++ 的三大特征 —— 封装、继承和多态,或许就是你一直在寻找的关键所在。
?这三个特征犹如三把神奇的钥匙,能够帮助我们打开高效编程的大门。
?封装
?“如何保护数据的安全性和完整性,同时使代码的结构更加清晰呢❓”
1.封装概念
封装是将数据和操作数据的方法封装在一个类里面,并通过访问控制符来限制对类成员的访问。就像给它们穿上保护衣,只能通过特定接口访问修改数据。2.封装格式
在类的定义中,通过private
、public
和protected
等访问控制符来实现封装。例如:
class MyClass {private: int privateData;public: void setData(int value) { privateData = value; } int getData() { return privateData; }};
关于其具体的解释请观看我之前的文章?【C++】类与对象基础概念解析
3.封装的原理
⭐封装的核心原理是隐藏内部实现细节,只暴露必要的接口给外部。这样可以防止外部代码直接访问和修改类的内部数据,从而保证数据的安全性和一致性。同时,通过将相关的数据和操作放在一起,使代码的逻辑结构更加清晰,易于理解和维护。
4.封装的作用
保护数据安全,避免意外修改;提高可维护性,修改内部不影响外部;增强复用性,封装好的类可在不同项目使用。?以下是一个展示 C++ 封装特性的代码示例:?
#include <iostream>#include <string>// 定义一个名为Person的类,用于表示人的信息class Person {private: // 私有成员变量,用于存储人的姓名 std::string name; // 私有成员变量,用于存储人的年龄 int age;public: // 构造函数,用于初始化人的姓名和年龄 Person(const std::string& name, int age) : name(name), age(age) {} // 获取姓名的函数,通过公共接口访问私有成员变量name std::string getName() const { return name; } // 获取年龄的函数,通过公共接口访问私有成员变量age int getAge() const { return age; } // 设置年龄的函数,通过公共接口修改私有成员变量age void setAge(int newAge) { if (newAge >= 0) { // 进行简单的合法性检查 age = newAge; } else { std::cerr << "年龄不能为负数" << std::endl; } }};int main() { // 创建一个Person对象,传入姓名和年龄 Person person("Alice", 25); // 通过公共接口获取并输出人的姓名和年龄 std::cout << "姓名: " << person.getName() << ", 年龄: " << person.getAge() << std::endl; // 通过公共接口修改年龄 person.setAge(26); // 再次获取并输出人的年龄 std::cout << "新年龄: " << person.getAge() << std::endl; return 0;}
?继承
?“如何避免重复写相似代码,建立代码层次呢❓”
1.继承的概念
?一个类(派生类)能继承另一个类(基类)的属性和方法,并可扩展。
2.继承格式
派生类定义中用:
符号,后跟继承方式和基类名。例如:
class BaseClass {public: void baseMethod() { // 基类方法实现 }};class DerivedClass : public BaseClass {public: void derivedMethod() { // 派生类方法实现 }};
3.继承的原理
派生类继承基类非私有成员(继承方式会影响访问权限),就像孩子继承父母特质。
4.继承的作用
实现代码复用,提取共性放基类,派生类继承避免重复;建立层次结构,清晰看到类派生关系;方便扩展,添加新类可继承合适基类。?以下是一个展示 C++ 继承特性的代码示例:?
#include <iostream>#include <string>// 基类:动物类class Animal {public: // 动物类的构造函数,用于初始化动物的名称 Animal(const std::string& name) : name(name) {} // 纯虚函数,用于表示动物发出声音的行为 // 因为不同动物叫声不同,所以在基类中不给出具体实现 virtual void makeSound() const = 0; // 获取动物名称的函数 std::string getName() const { return name; }protected: // 动物的名称,受保护成员,派生类可以访问 std::string name;};// 派生类:猫类,继承自动物类class Cat : public Animal {public: // 猫类的构造函数,调用基类的构造函数初始化动物名称 Cat(const std::string& name) : Animal(name) {} // 重写基类的纯虚函数,实现猫发出声音的行为 void makeSound() const override { std::cout << name << " says Meow!" << std::endl; }};// 派生类:狗类,继承自动物类class Dog : public Animal {public: // 狗类的构造函数,调用基类的构造函数初始化动物名称 Dog(const std::string& name) : Animal(name) {} // 重写基类的纯虚函数,实现狗发出声音的行为 void makeSound() const override { std::cout << name << " says Woof!" << std::endl; }};int main() { // 创建一个猫对象,传入名称 "Kitty" Cat cat("Kitty"); // 创建一个狗对象,传入名称 "Buddy" Dog dog("Buddy"); // 调用猫对象的发出声音函数 cat.makeSound(); // 调用狗对象的发出声音函数 dog.makeSound(); return 0;}
?多态
?“怎样让同一操作在不同对象有不同效果,使程序更灵活呢?”
1.多态的概念
同一操作对不同对象有不同表现形式,C++ 中主要通过虚函数和函数重载实现。
2.多态的格式
基类中定义虚函数(virtual 返回值类型 函数名(参数列表) = 0;
纯虚函数或virtual 返回值类型 函数名(参数列表);
普通虚函数),派生类中重写(返回值类型 函数名(参数列表) override;
)。例如:
class Shape {public: virtual void draw() = 0;};class Circle : public Shape {public: void draw() override { // 圆形绘制方法 }};class Rectangle : public Shape {public: void draw() override { // 矩形绘制方法 }};
3.多态的原理
基于动态绑定,通过基类指针或引用调用虚函数时,运行时根据对象实际类型决定调用哪个派生类函数实现。
4.多态的作用
提高灵活性,处理不同对象用统一接口,自动选合适函数实现;增强可维护性,添加新对象类型只需创建派生类实现虚函数;实现通用性,可写通用代码适用于多种对象。?以下是一个展示 C++ 多态特性的代码示例:?
#include <iostream>// 基类:形状class Shape {public: // 纯虚函数,用于绘制形状,不同形状有不同的绘制方式 virtual void draw() const = 0;};// 派生类:圆形class Circle : public Shape {public: // 重写基类的纯虚函数,实现圆形的绘制方式 void draw() const override { std::cout << "Drawing a circle." << std::endl; }};// 派生类:矩形class Rectangle : public Shape {public: // 重写基类的纯虚函数,实现矩形的绘制方式 void draw() const override { std::cout << "Drawing a rectangle." << std::endl; }};// 函数接受基类指针,通过多态实现不同形状的绘制void drawShape(const Shape* shape) { shape->draw();}int main() { // 创建圆形对象 Circle circle; // 创建矩形对象 Rectangle rectangle; // 通过基类指针调用 drawShape 函数,实现多态 drawShape(&circle); drawShape(&rectangle); return 0;}
?总结
?C++ 的封装、继承和多态是构建高效、灵活和可维护程序的重要基础。封装、继承和多态分别在数据安全、代码复用、程序灵活等方面发挥重要作用。
?学习完C++三大特性,我们来看以下代码:
?以下是一个综合展示 C++ 封装、继承和多态特性的代码示例:?
#include <iostream>#include <string>// 基类:动物类class Animal {protected: // 受保护的成员变量,用于存储动物的名字 std::string name;public: // 构造函数,初始化动物的名字 Animal(const std::string& animalName) : name(animalName) {} // 纯虚函数,用于发出声音,不同动物有不同的实现 virtual void makeSound() const = 0; // 获取动物名字的函数 std::string getName() const { return name; }};// 派生类:猫类class Cat : public Animal {public: // 构造函数,调用基类构造函数初始化名字 Cat(const std::string& catName) : Animal(catName) {} // 重写纯虚函数,实现猫的声音 void makeSound() const override { std::cout << name << " says Meow!" << std::endl; }};// 派生类:狗类class Dog : public Animal {public: // 构造函数,调用基类构造函数初始化名字 Dog(const std::string& dogName) : Animal(dogName) {} // 重写纯虚函数,实现狗的声音 void makeSound() const override { std::cout << name << " says Woof!" << std::endl; }};// 测试函数,接受基类指针,利用多态调用不同派生类的函数void testAnimal(const Animal* animal) { animal->makeSound();}int main() { // 创建猫对象 Cat cat("Fluffy"); // 创建狗对象 Dog dog("Rex"); // 通过基类指针调用测试函数,展示多态 testAnimal(&cat); testAnimal(&dog); return 0;}
在这个代码中:
封装:在Animal
类中,将成员变量name
设为受保护的,外部不能直接访问,只能通过公共接口(如getName
函数)来获取动物的名字,实现了封装。继承:Cat
类和Dog
类都继承自Animal
类,继承了基类的成员变量和函数,并且可以在派生类中添加自己特有的行为。多态:通过基类指针调用makeSound
函数时,根据实际指向的对象类型(猫或狗),会自动调用相应派生类的重写函数,实现了多态。这样可以用统一的接口处理不同类型的对象。
?以上就是本文的全部内容啦~
以后我将深入研究它们与其他 C++ 特性结合,解决更复杂编程问题!
欢迎关注我?【A Charmer】