记录C++ 8

多态

多态在c++中分静态多态和动态多态:
静态多态使用函数重载和泛型编程实现
动态多态基于虚函数实现

动态绑定与静态绑定

定义:静态绑定指程序结束编译后就已经确定行为,动态绑定指在运行时确定行为
作用:把不同派生类对象都当作基类看可以屏蔽不同子类对象之间的差异,提高程序的通用性适应需求的不断变化

虚函数与动态多态的实现

在函数名字前加上virtual关键字进行声明
创建2个类并且是继承关系,基类的函数声明为虚函数,派生类继承基类并重写基类的函数,通过基类的指针或引用访问派生类对象
非类的成员函数不能定义为虚函数,类的静态成员函数不能定义虚函数,构造函数不能定义为虚函数,析构函数可以定义为虚函数,基类的某个函数声明为虚函数,派生类同名函数自动成为虚函数
cpp 复制代码
#include <iostream>
using namespace std;
class A
{
public:
    virtual void add() {}
};

class B : public A
{
public:
    void add() {}
};

重写

重写的定义:派生类实现基类的虚函数
特点:不同作用域,函数名相同参数相同返回值相同基类必须要virtual关键字
原理:通过父类指针或引用指向子类对象

重载

重载的定义:同一作用域函数名相同参数不同的多个函数间构成重载
特点:相同作用域,函数名相同参数不同,返回值可有可无,virtual关键字可有可无

隐藏

定义:基类与派生类有同名函数,调用时候都是子类的函数,此时父类成员函数会被隐藏
特点:不同作用域,函数名相同,返回值和参数可同可不同
子类对象调用重新实现与父类函数同名的函数

隐藏与覆盖的区别

相同点:子类对象在调用时都是调用子类实现的成员函数
不同点:父类指针指向子类对象时 覆盖情况下,父类指针调用的函数是子类实现的函数
父类指针指向子类对象时 隐藏情况下,父类指针调用的函数是父类实现的函数

虚析构函数

建议将基类的析构函数设置为虚函数,基类的析构函数为虚函数则派生类的析构函数也会自动成为虚函数
当基类的指针指向派生类时,基类的析构函数不是虚函数就不会发生动态多态,只会调用基类的析构函数就会造成内存泄漏
cpp 复制代码
#include <iostream>
using namespace std;

class A
{
private:
    int i;

public:
    A() : i(10)
    {
        cout << "haha" << endl;
    }
    virtual ~A()
    {
        cout << "xixi" << endl;
    }
};
class B : public A
{
private:
    int x;

public:
    B() : x(5)
    {
        cout << "aabbcc" << endl;
    }
    ~B()
    {
        cout << "qqwwee" << endl;
    }
};
int main()
{
    A *p = new B;
    delete p;
    return 0;
}
相关推荐
§ꦿCFོ༉5 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
投图匠5 小时前
十种不同风格的 CTP接口 框架
开发语言·python
爱笑的k118 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
X1A0RAN9 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
熊猫钓鱼>_>11 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮11 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
布莱克60512 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
布莱克60513 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型
老歌老听老掉牙13 小时前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso
Severus_black14 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl