多态原理剖析
C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数
1:用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。
2:存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。
3:多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。
4:多态用虚函数来实现,结合动态绑定.
5:纯虚函数是虚函数再加上 = 0;
6:抽象类是指包括至少一个纯虚函数的类。
class Animal
{
public:
virtual void speak() = 0;
};
class Cat :public Animal
{
public:
Cat(string name)
{
cout << "Cat构造函数的调用" << endl;
m_Name = new string(name);
}
~Cat()
{
cout << "Cat析构函数的调用" << endl;
if (m_Name != NULL)
{
delete m_Name;
m_Name = NULL;
}
}
virtual void speak()
{
cout << "猫在说话" << endl;
}
private:
string* m_Name;//名字创建在堆区,用指针维护
};
void test()
{
/*Cat cat;
Animal& animal = cat;
animal.speak();*/
Animal* animal = new Cat("Tom");
animal->speak();
}
int main()
{
test();
system("pause");
return 0;
}
当父类的成员函数加上virtual之后,父类中会增加一个虚函数指针vfptr,vfptr指向虚函数表vftable,vftable中保存的是虚函数的入口地址&Animal ::speak,当子类重写父类的虚函数之后,子类继承的虚函数表中保存的地址变成了&Cat::speak,当把父类的引用指向子类的对象时,会从子类的虚函数表中去找函数入口地址,从而调用子类的speak函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!