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(){};纯虚析构 需要声明也需要实现  有了纯虚析构之后,这个类也属于抽象类,无法实例化对象

虚析构和纯虚析构共性:

· 可以解决父类指针释放子类对象

· 都需要有具体的函数实现

虚析构和纯虚析构区别:

如果是纯虚析构,该类属于抽象类,无法实例化对象

 

如果子类中没有子类对象,可以不写虚析构或者纯虚析构

 

 

 

 

 

 

 在实例化对象时,可以把每个部件实例化出来,用对应的指针指向  然后再统一进行组装

或者直接在实例化对象的时候,把每一部件实例化出来

 

posted @   小小是  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示