多态原理剖析

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函数

 

posted @   电线杆上写代码  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示