创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容💖:
专栏:c语言之路重点知识整合
【c语言】全部知识点总结
目录
- 一、虚析构
- 二、纯虚函数、抽象类
- 三、多态的缺点:
一、虚析构
继承中构造函数与析构函数执行的顺序
当使用父类类型指针指向子类对象实现多态时,如果子类中额外申请了内存空间,在执行析构函数时不会执行子类的析构函数
例如:
class CFather
{
public:
CFather() { cout << "CFather" << endl; }
~CFather() { cout << "~CFather" << endl; }
};
class CSon :public CFather
{
public:
CSon()
{
char* p = new char[10];
}
~CSon()
{
cout << "~CSon" << endl;
}
};
int main()
{
CFather* pfa = new CSon;
delete pfa;
return 0;
}
执行发现:
子类中的析构函数并没有被调用,子类中额外申请的内存空间也没有被回收
这个问题需要使用虚析构来解决
在父类的析构函数前加上关键字virtual
,使父类的析构函数变为虚析构
再次delete
:按照父-子—子-父的顺序执行析构函数:
在实现多态时,一定要将父类的析构变为虚析构!
二、纯虚函数、抽象类
在多态下,有时抽象出来的父类的虚函数作为接口函数,不知道如何实现或不需要实现
只有继承的子类才明确如何实现,就可以把父类的虚函数变为纯虚函数
做法是:将父类中的虚函数加上 =0
virtual void fun() = 0;
-
纯虚函数在当前类不必实现,而子类必须要重写实现纯虚函数,否则不能定义子类对象(error:纯虚函数xxx 没有强制替代项)
-
当类中存在纯虚函数时,这个类就被称为抽象类,抽象类不允许定义对象
-
接口类:类中的所有虚函数都是纯虚函数
例如:
class CFather
{
public:
//纯虚函数:只声明,不需要定义
//在子类中一定要重写父类的这个纯虚函数,否则不能定义子类对象(error:纯虚函数xxx 没有强制替代项)
virtual void eat() = 0;
};
class CSon :public CFather
{
public:
void eat() { cout << "CSon::eat()" << endl; }
};
int main()
{
CFather* pFa = new CSon;
pFa->eat();
//CFather fa; //error: 不允许使用抽象类定义对象
return 0;
}
三、多态的缺点:
- 效率问题:多态是通过虚函数实现,虚函数调用流程复杂,效率低
- 空间问题:虚函数指针占用指针大小的空间且每个对象都会存在一份,虚函数列表会随着继承的层级增大,其大小只增不减
- 安全问题:如果一个函数是私有的函数,就不要变为虚函数
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |