【C++】多态

2023-10-29


需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。


 目录

一、多态的概念

二、静态的多态

三、动态的多态

1、虚函数

2、虚函数的重写(覆盖)

3、利用虚函数的重写实现多态

4、虚函数重写的例外

4.1协变(返回值分别为构成父子关系的指针或引用,也构成重写)

4.2析构函数是虚函数的场景(动态申请的子类对象,交给父类指针管理,需要virtual修饰析构函数)

四、C++11中的final和override

1、C++98防止一个类被继承的方法

2、C++11的final关键字

2.1final修饰类,防止该类被继承

2.2final修饰虚函数,防止该虚函数被重写

3、C++11的override关键字

override修饰子类重写的虚函数,检查是否完成重写

五、重载、重写、隐藏的区别

六、抽象类(接口类)

1、抽象类的概念

2、实现继承和接口继承

七、多态的实现原理

1、虚函数表

2、多态的原理

2.1形成多态的原因

2.2为什么一定要传入从子类对象切片而来的父类对象的指针/引用才能引发多态?为什么不能直接传入切片的父类对象?

2.3多态与非多态的成员函数调用区别

八、单继承和多继承中子类虚函数表

九、关于多态的问答题

1、什么是多态?

2、重载、重写(覆盖)、重定义(隐藏)的区别?

3、多态的实现原理?

4、inline可以是虚函数吗?

5、静态成员可以是虚函数吗?

6、构造函数可以是虚函数吗?

7、析构函数可以是虚函数吗?

8、对象调用普通成员函数快还是虚函数快?

9、什么是抽象类?抽象类的作用?


一、多态的概念

        多态指多种形态。不同的对象完成同一件事情,但是结果不同。例如公交刷卡行为:成人刷卡全价,学生刷卡半价。亦或是不同的客户来消费,金卡会员8折,银卡会员9折,普通会员无折扣。

二、静态的多态

        静态的多态是在编译时产生不同。例如函数重载就是一种静态的多态行为。看上去是在调用同一个函数,但是会产生不同的行为。

int main()
{
    int a=1;
    double b=2.3;
    std::cout<<a<<std::endl;
    std::cout<<b<<std::endl;
    return 0;
}

三、动态的多态

        动态的多态是在运行时产生不同。

        构成多态的条件:缺一不可,否则就不构成多态。

        1、必须通过父类对象的引用或指针当做形参调用虚函数。(仅限引用和指针是原因见下文)

        2、子类必须完成对父类虚函数的重写且被调用的函数是虚函数。

1、虚函数

class Person 
{
public:
    virtual void BuyTicket() 
    { 
        cout << "买票-全价" << endl;
    }
};
class Student : public Person
{
public:
virtual void BuyTicket()
    {
        cout<<"买票-半价"<<endl;
    }
};

        被virtual关键字修饰的类的非静态成员函数称为虚函数。

        注意虚函数和虚继承虽然都使用了virtual关键字,但是它们没有关系。

        1、子类重写父类虚函数时,子类“三同”函数不写virtual也构成重写,但是不规范。C++设计者的初衷是父类写了virtual,即使子类不写,也构成多态,那就不会出现内存泄漏的情况了。(设计项目时可能父类和子类并不是同一个人写的,那么子类程序员没写virtual的概率极大)

        2、可以这样理解:虽然子类对应函数没写virtual,但他先继承了父类中虚函数的“虚”属性,再完成重写。注意:类作用限定符也会被子类继承,如果父类虚函数是public,即使子类重写函数是private,也会变成public

2、虚函数的重写(覆盖)

        如果父类中存在虚函数,并且子类拥有“三同”成员函数:返回值类型函数名称参数列表均相同。那么子类的虚函数就是对父类虚函数的重写。例如上面例子中Student::BuyTicket()是Person::BuyTicket() ,它们构成重写,而不是构成隐藏。

        重写还有一个叫法是覆盖。子类重写父类的虚函数意为子类重写的函数会覆盖父类的这个虚函数。(下文会细讲)

3、利用虚函数的重写实现多态

class Person 
{
public:
    virtual void BuyTicket() 
    { 
        cout << "买票-全价" << endl;
    }
};
class Student : public Person
{
public:
    virtual void BuyTicket()
    {
        cout<<"买票-半价"<<endl;
    }
};
void Func(Person& p)//子类传入会被切片,所以可以不用const/构成多态,跟p类型无关,传子调子,传父调父
{
    p.BuyTicket();
}
int main()
{
    Person p;
    Student s;
    //传入父类对象,调用父类的BuyTicket();传入子类对象将调用子类的BuyTicket();
    Func(p);
    Func(s);//这里的s会被切片传参
}

        先看构不构成多态,构成多态,那么和对象类型无关,传入哪个对象的引用/指针就使用谁的虚函数。

        如果不构成多态,均调用p类型的函数。

4、虚函数重写的例外

4.1协变(返回值分别为构成父子关系的指针或引用,也构成重写)

        构成重写需要成员函数返回值相同,但是存在例外,当返回值是构成父子关系的指针或引用时,它们也构成重写。这种重写叫做协变。不过父类返回值一定要用父指针/父引用,子必须用子指针/子引用,不能颠倒。

4.2析构函数是虚函数的场景(动态申请的子类对象,交给父类指针管理,需要virtual修饰析构函数)

class Person 
{
public:
    virtual ~Person()
    {}
};
class Student : public Person
{
public:
    virtual ~Student()
    {}
};

        析构函数也可重写,虽然父子析构函数的函数名表面上不一样,但其实所有析构函数的函数名都会被处理成destructor。

下面看个场景:

        各new一个父类/子类的对象,交给父类指针管理,这没问题。但是在析构的时候,因为是父类指针,所以p1p2都会去调用父类的析构函数,但别忘了起初我们可是new了一个子类对象,如果子类对象中存在资源,那么就会导致内存泄漏!

        为了避免这种情况,就需要使用virtual关键字修饰析构函数:

        父子构造函数构成多态,那就不看p1p2的类型了,p1p2指向哪个对象,就调用哪个对象的析构函数。

四、C++11中的final和override

1、C++98防止一个类被继承的方法

class Person
{
public:
    static Person CreateObj()
    {
        //new Person;
        return Person();
    }
private:
    Person()
    {}
};
class Student : public Person
{
public: 
};
int main()
{
	Person p=Person::CreateObj();
    return 0;
}

        C++98通过把构造函数变为私有的方式,让子类继承后根本构造不出父类对象。

        但是父类却可以通过静态的“偷家”函数构造对象。(这里必须静态,静态成员函数调用无需借助对象。如果是非静态成员函数,则需要对象才能调用,但是生成对象必须通过这个函数······无限循环了)

2、C++11的final关键字

2.1final修饰类,防止该类被继承

class Person final
{
public:
};

        Person被final修饰后将不能被继承,

2.2final修饰虚函数,防止该虚函数被重写

3、C++11的override关键字

override修饰子类重写的虚函数,检查是否完成重写

        为了防止程序员在子类进行重写时,函数名拼写出现错误,这就造成了重写的函数和父类被重写的函数对不上。这是个很严重的问题,因为这种情况并不违反语法规则,编译期间编译器是不会报错的,只有在程序运行时发现结果不对,回去debug时才能发现问题。

        C++很贴心的增加了override关键字,成员函数被修饰后,编译器会帮忙检查是否重写成功。

五、重载、重写、隐藏的区别

六、抽象类(接口类)

1、抽象类的概念

        在虚函数的后面加上=0,则这个函数被称为纯虚函数包含纯虚函数的类被称为抽象类(接口类)。一个类型,在现实世界中没有对应的实物,就可以定义为抽象类。例如职能类、Person类等。

抽象类不能实例化出对象

class Person 
{
public:
    virtual void Func()=0
    {
        //纯虚函数一般只声明,不实现。因为没有对象
    }
};

        子类继承了父类的纯虚函数,子类也变成了抽象类,同样不能实例化出对象。

        除非子类重写纯虚函数,子类才能实例化出对象。

抽象类的作用是强制子类进行重写

2、实现继承和接口继承

        子类继承父类的普通函数,是为了使用该函数的具体实现,这是实现继承。

        而虚函数是为了让子类进行重写,实现多态,子类只继承了函数名,并不继承具体实现,这是接口继承,接口继承会继承父类的类作用限定符和缺省参数

        所以不准备实现多态的话,就不要用virtual去修饰成员函数了。

七、多态的实现原理

1、虚函数表

        注意:虚函数表指针并不一定放在所有成员变量的最前面,有的编译器会放在最后面。虚函数表指针指向的虚函数表本质是存放虚函数指针的函数指针数组,vs下会在这个数组最后放一个nullptr,而Linux不会。

        虚函数表存放于常量区(代码段)

        vs中虚函数表中存放的并不是虚函数的地址,而是一句jump指令的地址,通过该jump指令找到对应的虚函数。

再看一段代码:

        p能调用Func1是因为Func1并不存放在类中,而是在代码区,所以p->Func1并不是解引用,而是将p当做形参传递给this。

        p调不了Func2是因为虚函数需要通过类对象中的虚函数表指针找到对应的虚函数进行调用,所以它是一个解引用行为,p是nullptr,对空指针的解引用行为引发程序崩溃。

2、多态的原理

2.1形成多态的原因

class Person
{
public:
    virtual void BuyTicket()
    {
        cout << "买票-全价" << endl;
    }
private:
    int _a;
};
class Student : public Person
{
public:
    virtual void BuyTicket()
    {
        cout << "买票-半价" << endl;
    }
private:
    int _b;
};
void Func(Person& p)//子类传入会被切片,所以可以不用const/构成多态,跟p类型无关,传子调子,传父调父
{
    p.BuyTicket();
}
int main()
{
    Person p;
    Student s;
    //传入父类对象,调用父类的BuyTicket();传入子类对象将调用子类的BuyTicket();
    Func(p);
    Func(s);//这里的s会被切片传参
}

        从监视窗口可以看到,子类中的虚函数表指针存放于继承于父类的那部分,但是父子对象中虚函数表指针及指向的虚函数并不是同一个。切片后得到的父类对象的虚函数表指向重写的虚函数,这就解释了传入一个父类对象的指针/引用就调用父类对象的虚函数,传入一个从子类切片而来的父类对象的指针/引用就会去调用重写的虚函数。

注:同类型的对象,虚表指针是相同的,均指向同一张虚函数表

2.2为什么一定要传入从子类对象切片而来的父类对象的指针/引用才能引发多态?为什么不能直接传入切片的父类对象?

        因为指针/引用切片出来的父类对象能获得重写的虚函数,值切片出来的父类对象中的虚函数必须源自于父类。(想一想如果值切片的父类对象中的虚函数拷贝自子类重写的虚函数,那不是乱套了。例如虚函数是析构函数,值切片后的父类中的析构函数如果是子类的析构函数,那么父类对象在析构的时候要出大问题)

2.3多态与非多态的成员函数调用区别

        函数调用满足多态,需要在程序运行时去对象中的虚函数表中找虚函数进行调用;不满足多态的成员函数,编译器在编译时确定调用的地址。

八、单继承和多继承中子类虚函数表

        1、单继承中,子类中非重写虚函数将放在同一张虚函数表中。

当然对子类进行切片时,切片得到的父类对象是不会得到func3和func4的。

        2、多继承中,子类中非重写的虚函数将被存放于第一个继承的父类部分的虚函数表中。

九、关于多态的问答题

1、什么是多态?

        多态指多种形态。不同的对象完成同一件事情,但是结果不同。例如公交刷卡行为:成人刷卡全价,学生刷卡半价。亦或是不同的客户来消费,金卡会员8折,银卡会员9折,普通会员无折扣。

2、重载、重写(覆盖)、重定义(隐藏)的区别?

        函数重载:1、两个函数在同一作用域2、函数名相同,参数列表不同,返回值没有要求;

        重写:1、两个函数必须位于子类和父类中2、函数名、参数列表、返回值必须相同(协变除外)3、两个函数均为虚函数;

        隐藏:1、两个函数必须位于子类和父类中2、函数名相同3、不构成重写,就构成隐藏。

3、多态的实现原理?

        对于多态的实现原理,必须先从构成多态的条件说起:1、必须通过父类对象的引用或指针当做形参调用虚函数。2、子类必须完成对父类虚函数的重写且被调用的函数是虚函数。

        子类和父类的虚函数表指针、虚函数表、重写的虚函数的地址均不相同,我们传入一个父类对象,它使用的是源自父类的虚函数,传入一个从子类切片而来的父类对象,这个对象中的虚函数是子类重写的虚函数。虽说这两个都是父类对象,但是对象体内的虚函数并不是同一个,所以会产生不同的行为,这便是多态的原理。

4、inline可以是虚函数吗?

        inline可以是虚函数。调用时,如果不构成多态,这个函数就保持inline属性。如果构成多态,就不具备inline属性,因为多态是要在运行时去对象的虚函数表里面找虚函数,所以在编译时,不能使用inline进行展开。

5、静态成员可以是虚函数吗?

        静态成员不能是虚函数。因为静态成员没有this指针,在外部可以直接使用类名::成员函数的方式对静态成员函数进行调用,但是调用虚函数需要通过对象才能找到虚函数表,所以静态成员不能是虚函数。

6、构造函数可以是虚函数吗?

        构造函数不能是虚函数。因为对象的虚函数表指针是在构造函数的初始化列表中进行初始化。(先有鸡还是先有蛋的问题)

7、析构函数可以是虚函数吗?

        析构函数可以是虚函数,用于处理子类对象交给父类的指针管理的情况。

8、对象调用普通成员函数快还是虚函数快?

        如果不构成多态,即使是虚函数,也是在编译阶段确定调用地址,速度一样快;但是一旦构成多态,编译器在运行时通过对象去虚函数表中确定虚函数的调用地址,这个时候就是普通函数快了。

9、什么是抽象类?抽象类的作用?

        抽象类又称接口类。包含纯虚函数的类被称为抽象类,在虚函数后边加个=0,这个虚函数就被叫做纯虚函数。抽象类不能实例化出对象。在现实世界中没有对应的实物,就可以定义为抽象类。例如职能类、Person类等。

        抽象类体现接口继承的关系。子类继承抽象类后,也变成了抽象类。这就强制用户对纯虚函数进行重写,对虚函数的重写是一种接口继承,子类会继承虚函数的函数名及缺省值,但不会继承实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】多态 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • PWNHUB 一场新鲜赛事速达【六月内部赛】 web - login game + Misc - 伏羲八卦

    PWNHUB 一场新鲜赛事速达 六月内部赛 web login game Misc 伏羲八卦 web login game Misc 伏羲八卦 本文来自csdn的 shu天 平时会记录ctf 取证和渗透相关的文章 欢迎大家来我的主页 shu
  • thinkpad笔记本如何进bios设置u盘启动步骤

    thinkpad笔记本从u盘启动有两种方法 一种是使用u盘启动快捷键直接进入u盘装系统 另一种则需要进bios设置u盘为第一启动项 但首先要下载个u盘启动盘制作工具制作成启动u盘在进行 下面详细为大家介绍如何操作 方法一 使用u盘启动快捷键
  • 脚本一:编写一个脚本要求检测文件类型(简化版)

    要求 1 命名为check file sh 2 检测判断它是否存在 3 判断它是否为普通文件 4 判断其是否为目录 5 判断其是否为软链接 6 如没有文件名则报错 编写脚本如下 验证文件如下 可见如果文件不存在 直接报错 如果符合条件直接给
  • 《Web安全基础》05. XSS · CSRF · SSRF · RCE

    web 1 XSS 1 1 简介 1 2 防护与绕过 1 2 1 HttpOnly 1 2 2 WAF 绕过 1 3 相关资源 2 CSRF 3 SSRF 4 RCE 本系列侧重方法论 各工具只是实现目标的载体 命令与工具只做简单介绍 其使
  • 行人属性识别的一个调研

    行人属性识别的一个调研 知乎 前言 我感觉我掌握了财富密码 从知乎的后台数据来看 大家貌似更喜欢看综述多一点 因此这次给大家整个 行人属性识别 PAR 的综述 同样的 这次的综述比较老 是19年的 大家酌情看 适合入门用 首先还是保命时刻
  • 【会议分享】2022年智能车国际会议(ICoIV 2022)

    2022年智能车国际会议 ICoIV 2022 重要信息 会议网址 www icoiv org 会议时间 2022年10月14 16日 召开地点 中国成都 截稿时间 2022年8月30日 录用通知 投稿后2周内 收录检索 EI Scopus
  • 爬虫从入门到精通(8)

    文章目录 一 多进程和多线程介绍 二 普通爬虫 三 多线程爬虫 1 普通方法调用 2 线程类调用 四 多进程爬虫 1 普通方法调用 2 进程类写法 五 gevent协程爬虫 1 gevent模块简介 2 安装和依赖 3 gevent协程爬虫
  • 【深度学习】AlexNet

    从AlexNet开始 一 不可否认 深度学习的热潮正是由2012年AlexNet的出现而引发的 因此 学习AlexNet网络的结构 对于CNN的学习与理解是不可或缺的 在本篇博客中 将会对AlexNet的论文进行翻译与解读 并在下一篇博客中
  • android 壁纸服务,Android-Service实现手机壁纸自动更换

    本文实例为大家分享了Android Service实现自动更换手机壁纸的具体代码 供大家参考 具体内容如下 先看下效果 使用界面 划重点 使用service前别忘了给相应的service添加服务 具体实现 首先定义ChangeService
  • Dialog的exec和open

    今天在使用窗口时 发现了这样一个问题 抽象代码如下 结果第一次调用窗口时 一切正常 但是第二次调用时 窗口里的内容全部消失了 只有一个空白窗口 解决方法 调用open 函数 exec 函数会将程序卡到那里 open 函数生成窗口后立即返回
  • 祭旗之作

    渺小的我 一如原来那样的懒散 我拼命的使自己跟的牛人学习 但是 我总是掉队 我不愿意平庸 但是对于任何事情感觉都是没有坚持到最后 应该更加的坚持 犹豫与多虑 是我的性格 我渴望一直坚持下去 但好多时候 由于时间的关系 选择了放弃 我依然是我
  • SGL基本思路讲解

    SGL图形库是为Windows图形界面编程服务的 而且一切都是考虑到对新手友好的 在具体介绍提供给用户的函数之前 需要先说明一下应该以什么样的思路来构思我们的SGL程序 作为C语言程序 main函数总是需要在最开始就了解一下的 在SGL库中
  • STM32的中断与事件

    这张图是一条外部中断线或外部事件线的示意图 图中信号线上划有一条斜线 旁边标志19字样的注释 表示这样的线路共有19套 图中的蓝色虚线箭头 标出了外部中断信号的传输路径 首先外部信号从编号1的芯片管脚进入 经过编号2的边沿检测电路 通过编号
  • 多线程-单例模式 - Double Check Lock - Volatile

    单例模式 Singleton 保证一个类在程序中仅有一个实例 并提供一个访问该实例的全局访问点 单例模式的实现 饿汉模式 设计思想 在类加载时就创建一个不可变的静态的单例对象 如果该对象不被使用 则浪费了堆空间的资源 问题1 为什么加fin
  • 一文详解 RSA 非对称加密算法

    RSA加密算法是一种非对称加密算法 RSA是1977年由罗纳德 李维斯特 Ron Rivest 阿迪 萨莫尔 Adi Shamir 和伦纳德 阿德曼 Leonard Adleman 一起提出的 当时他们三人都在麻省理工学院工作 RSA就是他
  • Qt使用UDp通信、套接字socket的成员函数bind()的作用

    一 所谓bind 就是指绑定本地接受端口 指定ip 是为了分辨多ip主机 在有服务端和客户端的UDP中 bind是服务端调用的函数 绑定的是服务端的IP 假设服务端有多个网卡 即会有多个IP 这个时候我们可以选择用bind绑定其中一个IP
  • 【AntDB数据库】AntDB数据库整体架构

    整体架构 AntDB包括计算节点 Coordinator 数据节点 DB 全局事务管理器 GTM 和管理节点四种组件 其中GTM和DB为有状态的组件 需要考虑高可用 架构如下图 计算节点 Coordinator 提供SQL解析 优化 路由
  • 软体机器人接触压力分析

    背景介绍 机器人技术广泛用于工业生产 勘探勘测 医疗服务 军事侦察等领域 对于国民经济和国防建设具有重要意义 传统刚体机器人主要由硬质基体 金属 塑料等 和刚性运动副构成 能够快速 精确地完成工作任务 但这种传统的机器人运动灵活性有限 环境
  • [课程设计]Java实现图形化窗口界面可存储ATM机(自助取款机)

    很久以前写的了 没想到这么多浏览了 现在看着不是一般的乱 当时刚学java 望见谅 不过现在也没有闲工夫重写和心情修改了 凑活凑活吧 这是一个使用io流和swing库制作的可存储的窗口化ATM机程序 臭不要脸的发上来 实现的功能有 1 登录
  • 【C++】多态

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 多态的概念 二 静态的多态 三 动态的多态 1 虚函数