• 技术文章 >后端开发 >C#.Net教程

    C++复习要点总结十一——多态(二)

    黄舟黄舟2017-01-16 11:53:36原创729

    一 构造函数中能调用虚函数,实现多态吗

    1)对象中的VPTR指针什么时候被初始化?

    对象在创建的时,由编译器对VPTR指针进行初始化

    只有当对象的构造完全结束后VPTR的指向才最终确定

    父类对象的VPTR指向父类虚函数表

    子类对象的VPTR指向子类虚函数表

    class Parent
    { public:
    Parent(int a=0)//执行时此时的调用的print函数仍然是父类的函数(此时会将vptr指针指向父类的虚函数表)
    {
    this->a = a;
    print();
    }
    virtual void print() 
    { 
    cout<<"我是爹"<<endl; 
    }
    private:
    int a;
    };
    class Child : public Parent
    { public:
    Child(int a = 0, int b=0):Parent(a)//先执行父类构造器,执行完之后返回子类(vprt指针指回子类虚函数表)
    {
    this->b = b;
    print();
    }
    virtual void print()
    {
    cout<<"我是儿子"<<endl;
    }
    private:
    int b;
    };
    void HowToPlay(Parent *base)
    {
    base->print(); //有多态发生 //2 动手脚 
    }
    void main()
    {
    Child c1; //定义一个子类对象 ,在这个过程中,在父类构造函数中调用虚函数print 能发生多态吗?
    system("pause");
    return ;
    }

    68.png

    二 父类指针步长和子类指针步长不一致时

    class Parent
    {
    public:
    Parent(int a=0)
    {
    this->a = a;
    }
    virtual void print() 
    {
    cout<<"我是爹"<<endl;
    }
    private:
    int a;
    };
    //成功 ,一次偶然的成功 ,必然的失败更可怕
    class Child : public Parent
    {
    public:
    /*
    Child(int a = 0, int b=0):Parent(a)
    {
    this->b = b;
    print();
    }
    */
    Child(int b = 0):Parent(0)
    {
    //this->b = b;
    }
    virtual void print()
    {
    cout<<"我是儿子"<<endl;
    }
    private:
    //int b;
    };
    void HowToPlay(Parent *base)
    {
    base->print(); //有多态发生 //2 动手脚 
    }
    void main()
    {
    Child c1; //定义一个子类对象 ,在这个过程中,在父类构造函数中调用虚函数print 能发生多态吗?
    //c1.print();
    Parent *pP = NULL;
    Child *pC = NULL;
    Child array[] = {Child(1), Child(2), Child(3)};
    pP = array;
    pC = array;
    pP->print();
    pC->print(); //多态发生
    pP++;
    pC++;
    pP->print();
    pC->print(); //多态发生
    pP++;
    pC++;
    pP->print();
    pC->print(); //多态发生
    cout<<"hello..."<<endl;
    system("pause");
    return ;
    }

    69.png

    以上就是C++复习要点总结十一——多态(二)的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:C++,多态
    上一篇:C++复习要点总结之十——多态(一) 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言中源文件编译后生成什么文件• C#中GDI+编程10个基本技巧二• 应用绝对路径与相对路径• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误
    1/1

    PHP中文网