当前位置: 首页 > article >正文

实习复习DAY1

深入理解面向对象编程思想及其三大特性(封装、继承、多态)

C语言与C++的区别

  1. 头文件不同C语言头文件.hC++没有
  2. C语言没有Bool 类型
  3. C语言不能函数重载C++可以进行函数重载
  • 什么函数重载

一个作用域函数名字相同参数个数顺序或者类型其中一个不同称为函数重载函数重载返回值无关

C++为什么能够函数重载?

因为C++的编译器在编译函数的时候会将函数名原本的名字加上参数类型来识别不同的重载函数,但是C语言并没有这样的功能。因此语言不能函数重载

  1. C语言是面向过程编程,C++是面向对象编程
  2. NULL在C语言中是(void*)0 ,而在C++中是0。原因C语言允许(void*)指针隐式转换任何其他类型指针但是C++C语言更加严格是不允许这样转换的因此C++引入了nullptr代表空指针这样就避免了歧义

三大特性(封装、继承、多态)

说到面向对象编程,就要讲到对象的三大特性:封装,继承和多态

封装

将事物属性(成员变量)和行为(成员函数)封装在一起一个并且可以设置访问权限

class People {
public:
    string name;
    void eat();
private
    string sex;
};
  • 面向对象权限包括
  1. public公共权限所有都可以访问
  2. private私有权限只有当前可以访问
  3. protected受保护权限只有当前以及子类可以访问
  • 封装的原则:

对所成员变量使用private权限使用成员函数setget对变量进行读写可以防止成员变量暴露

继承

已经存在实现新的相当于现有进行扩展提高了代码的复用性可维护多态前提

class 派生类名:继承方式 基类的名称
class Apublic B

继承分为单继承多继承,单继承只有父类,多继承拥有多个父类

多继承可能导致菱形继承

菱形继承BC同时继承A所以BC拥有A中的共同属性如果此时D创建一个对象初始化这个共同属性此时会导致编译器没有办法辨认这个公共属性属于哪一个

#include <iostream>
using namespace std;
class A {
public:
    int value;
};
class B : public A {};
class C : public A {};

class D : public B, public C {};

int main() {
    D d;
    d.value = 10;  // 错误:二义性,无法确定是 B::value 还是 C::value
    cout << d.value << endl;
    return 0;
}

菱形继承解决办法

  1. 可以添加作用这个公共属性前面添加作用域此时编译器就能够区别
  2. 可以采用虚继承继承方式前面加上virtual

C++ 提供了虚继承的机制来解决菱形继承问题。虚继承确保在菱形继承结构中,最底层的派生类(如 D)只保留一份基类(如 A)的成员,从而消除二义性。

#include <iostream>
using namespace std;

class A {
public:
    int value;
};
class B : virtual public A {};  // 虚继承
class C : virtual public A {};  // 虚继承
class D : public B, public C {};
int main() {
    D d;
    d.value = 10;  // 正确:只有一份 A::value
    cout << d.value << endl;
    return 0;
}

虚继承的工作原理

虚继承通过引入一个虚基类表(Virtual Base Table)来实现。在虚继承的情况下:

  1. 编译器会为每个虚继承的类生成一个虚基类表。
  2. 最底层的派生类(如 D)会直接指向虚基类(如 A)的成员,而不是通过中间类(如 B 和 C)间接访问。
  3. 这样,无论 D 通过 B 还是 C 访问 A 的成员,都会指向同一份数据。

多态

不同的类对同一件事(即方法的调用)做出不同的,从而增强了代码的灵活性和可扩展性。

多态分为静态多态动态多态

  1. 静态多态(编译时多态)通过函数重载运算符重载实现
  2. 动态多态(运行时多态):通过虚函数继承实现父类指针引用子类对象并通过指针引用调用重写函数
(1)虚函数(Virtual Function)

虚函数是在基类中使用 virtual 关键字声明的函数,派生类可以重写(Override)这些函数。通过基类指针或引用调用虚函数时,实际调用的是派生类中重写的函数。

#include <iostream>
using namespace std;

class Animal {
public:
    virtual void speak() {  // 虚函数
        cout << "Animal speaks" << endl;
    }
};

class Dog : public Animal {
public:
    void speak() override {  // 重写虚函数
        cout << "Dog barks" << endl;
    }
};

class Cat : public Animal {
public:
    void speak() override {  // 重写虚函数
        cout << "Cat meows" << endl;
    }
};

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    animal1->speak();  // 输出: Dog barks
    animal2->speak();  // 输出: Cat meows

    delete animal1;
    delete animal2;
    return 0;
}
(2)纯虚函数和抽象类

如果基类中的虚函数没有实现,而是由派生类必须实现,那么这种虚函数称为纯虚函数。包含纯虚函数的类称为抽象类,抽象类不能实例化。

#include <iostream>
using namespace std;
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();  // 输出: Drawing Circle
    shape2->draw();  // 输出: Drawing Square

    delete shape1;
    delete shape2;
    return 0;
}


http://www.kler.cn/a/563917.html

相关文章:

  • LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师
  • 进入DeepSeek部署第一阵营后,奇墨科技推进多元应用场景落地
  • CentOS系统安装NFS
  • Harmony开发笔记(未完成)
  • Linux部署dnsmasq软件
  • OpenCV(10):视频目标跟踪、视频背景减除
  • [2/11]C#性能优化-不要使用空析构函数-每个细节都有示例代码
  • 结构型模式 - 组合模式 (Composite Pattern)
  • Prompt——绘制泳道图
  • vue3-07模拟vue3的响应式原理Proxy (代理对象)与Reflect (反射对象)
  • 《论企业集成平台的理解与应用》审题技巧 - 系统架构设计师
  • 判断一个链表是否为回文结构(C++)
  • 【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
  • 数仓搭建实操(传统数仓orale):DM数据集市层
  • 《论软件维护方法及其应用》审题技巧 - 系统架构设计师
  • 初识Skywalking
  • MuMu模拟器Pro for Mac 安卓手机平板模拟器
  • 在 WPF 项目中集成 Hangfire
  • 防爆手机科普:与普通手机的区别?在危险作业场景扮演什么角色?
  • DeepSeek开源周第二弹:DeepEP如何用RDMA+FP8让MoE模型飞起来?