c++(十)
c++的多态概念
多态分为两类
静态多态:函数重载和运算符重载 属于静态多态,复用函数名
动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态的区别:
静态多态的函数地址早绑定-编译阶段确定函数地址
动态多态的函数地址晚绑定-运行阶段确定函数地址
class Animal
{
public:
//speak函数就是虚函数
//函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了
virtual void speak()
{
cout << "动物在说话" << endl;
}
};
//猫类
class Cat :public Animal
{
public:
void speak()
{
cout << "小猫在说话" << endl;
}
};
//执行说话的函数
//地址早绑定在编译阶段就确定了函数的地址,所以不管这里不管是什么动物 出来的都是动物在说话
//如果想要执行让猫说话,那么这个函数地址不能提前绑定,需要在运行阶段进行绑定,地址晚绑定,那么需要的就是动态多态,在Animal的speak()函数前加上virtual关键字
//动态多态的满足条件
//1. 有继承关系
// 2. 子类要重写父类的虚函数 返回值 函数名 以及参数列表都要相同叫做重写 子类的virtual关键字是可写可不写的
//动态多态的使用
//父类的指针或者引用 执行子类对象 Animal &anima =cat
void doSpeak(Animal &animal)//Animal的引用接收cat对象 Animal &animal=cat; 在c++中是允许父子类的类型转换,不需要强制转换
{
animal.speak();
}
void test01()
{
Cat cat;
doSpeak(cat);
}
int main()
{
test01();
system("pause");
return 0;
}
只有一个非静态成员函数 相当于空类它的内存大小为1
加上virtual关键字之后它的内存大小为4 类的内部多了一个指针 64位系统是8位,32位系统是4位
虚指针是vfptr v-virtual f-function ptr-pointer 也就是虚函数指针 虚函数表指针
指针指向虚函数表,这个表叫vftable 表内记录虚函数地址 &Animal::speak的入口地址
子类如果继承有虚函数的父类,会将指针和&Animal::speak 也继承下来
若子类发生对父类虚函数的重写,子类的虚函数表内部 会替换成 子类的虚函数地址
&Cat::speak会将&Animal::speak覆盖 父类的虚函数表没有改变
当父类的指针或者引用指向子类对象时候,发生多态 (Animal &anima =cat;)
纯虚函数和抽象类
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
因此可以将虚函数改为纯虚函数
纯虚函数的语法:virtual 返回值类型 函数名 (参数列表)=0;
当类中有了纯虚函数,这个类也成为抽象类
抽象类的特点:
·无法实例化对象
·子类必须重写抽象类中的纯虚函数,否则也属于抽象类
虚析构和纯虚析构
多态使用时,如果子类 中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
解决方法:将父类中的析构函数改为虚析构或者纯虚析构
虚析构 virtual ~Animal(){cout<<"dssd"<<endl;},虚析构可以解决父类指针释放子类对象时不干净的问题
纯虚析构 virtual ~Animal()=0;它需要具体代码实现 在类外实现纯虚析构
Animal::~Animal(){};纯虚析构 需要声明也需要实现 有了纯虚析构之后,这个类也属于抽象类,无法实例化对象
虚析构和纯虚析构共性:
· 可以解决父类指针释放子类对象
· 都需要有具体的函数实现
虚析构和纯虚析构区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象
如果子类中没有子类对象,可以不写虚析构或者纯虚析构
在实例化对象时,可以把每个部件实例化出来,用对应的指针指向 然后再统一进行组装
或者直接在实例化对象的时候,把每一部件实例化出来
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具