[Lang] 虚函数
1.[Lang] 静态变量2.[Lang] Lambda表达式3.[Lang] 类成员修饰符4.[Lang] 构造与析构5.[Lang] 智能指针6.[Lang] 运算符重载
7.[Lang] 虚函数
8.[Lang] 函数模板9.[Lang] 类模板10.二分查找11.链表操作12.栈和队列13.二叉树遍历14.归并分治15.快速排序16.堆结构17.位运算18.链表操作219.二叉树常见题目20.前缀树21.前缀和22.二叉树常见题目223.二维差分24.滑动窗口25.双指针26.二分答案法27.单调栈28.单调队列29.并查集30.洪水填充31.一维动态规划32.二维动态规划33.二维动态规划234.三维动态规划35.子数组最大累加和36.子数组最大累加和237.零一背包[Lang] 虚函数
1. 虚函数与纯虚函数
多态分为静态多态和动态多态,静态多态指函数重载和运算符重载,而动态多态指虚函数。
动态多态的条件:
- 子类重写父类的虚函数
- 父类指针或引用指向子类对象
虚函数的底层原理:
- 对于每个包含虚函数的类,编译器都会创建一个虚函数表(vftable),每一个虚函数表项指向对应的虚函数;该类的每个对象都有一个虚函数表指针(vfptr),指向所属类的虚函数表。
- 如果子类没有重写虚函数,那么该虚函数表项将保留;如果子类重写了虚函数,那么该虚函数表项将更新;如果子类定义了新的虚函数,那么该虚函数表将添加一个新的虚函数表项。
- 当通过父类指针或引用调用虚函数时,程序会首先找到父类指针或引用指向的子类对象,然后通过子类对象中的(vfptr)找到对应的虚函数表(vftable),然后通过查找虚函数表中的相应项找到虚函数的地址,最后进行函数调用。
包含纯虚函数的类为抽象类,无法实例化对象;子类必须重写抽象类的纯虚函数,否则依然属于抽象类。
#include<iostream>
using namespace std;
class Animal
{
public:
virtual void speak() = 0;
};
class Dog : public Animal
{
public:
virtual void speak()
{
cout << "I am a dog." << endl;
}
};
int main()
{
Animal *a = new Dog;
a->speak();
delete a;
a = nullptr;
return 0;
}
PS D:\CppDev\Lang\virtual_function> cd "d:\CppDev\Lang\virtual_function\" ; if ($?) { g++ test1.cpp -o test1 } ; if ($?) { .\test1 }
I am a dog.
2. 虚析构和纯虚析构
当父类指针或引用指向堆区子类对象且子类存在堆区成员变量时,必须使用虚析构或纯虚析构,避免悬空指针问题。
纯虚析构必须在类外实现。
#include<iostream>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "Animal构造函数调用" << endl;
}
virtual ~Animal() = 0;
};
Animal::~Animal()
{
cout << "Animal析构函数调用" << endl;
}
class Dog : public Animal
{
public:
string *name;
Dog(string name)
{
this->name = new string(name);
cout << "Dog构造函数调用" << endl;
}
virtual ~Dog()
{
if (name != nullptr) delete name;
cout << "Dog析构函数调用" << endl;
}
};
int main()
{
Animal *a = new Dog("Wangcai");
delete a;
a = nullptr;
return 0;
}
PS D:\CppDev\Lang\virtual_function> cd "d:\CppDev\Lang\virtual_function\" ; if ($?) { g++ test2.cpp -o test2 } ; if ($?) { .\test2 }
Animal构造函数调用
Dog构造函数调用
Dog析构函数调用
Animal析构函数调用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具