• 虚函数的底层实现机制、虚函数内存布局以及虚函数局限


    虚函数的内存布局以及局限,请参照下面网址的介绍,很详细很精彩

    https://blog.csdn.net/lixungogogo/article/details/51138493

      C++在基类中声明一个带关键之Virtual的函数,这个函数叫虚函数;它可以在该基类的派生类中被重新定义并被赋予另外一种处理功能。通过指向指向派生类的基类指针或引用调用虚函数,编译器可以根据指向对象的类型在运行时决定调用的目标函数。这就实现了多态。

    #include<iostream>
    using namespace std;
     
    class Base
    {
    public:
    virtual void fun1 () {cout<<" printf base fun1!" <<endl;}
    virtual void fun2 () {cout<<" printf base fun2!" <<endl;}
    private:
    int m_data1;
    } ;
     
    class Derive: public Base
    {
    public:
    void fun1 () {cout<<" printf derive fun1!" <<endl;}
    void fun3 () {cout<<" printf derive fun3" <<endl;}
    private:
    int m_data2;
    } ;
     
    int main ()
    {
    Base *pBase=new Derive;
    Derive a;
    pBase->fun1 () ;
    pBase->fun2 () ;
    a.fun3 () ;
    return 0;
    }

    在每一个含有虚函数的类对象中,增加了一个成员,就是都含有一个VPTR,指向虚函数表。

    派生类也会继承基类的虚函数,如果宅派生类中改写虚函数,虚函数表就会受到影响;表中元素所指向的地址不是基类的地址,而是派生类的函数地址。

    当执行语句pBase->fun1()时,由于PBase指向的是派生类对象,于是就调用的Deriver::fun1()。

    2、多重继承的情况

    #include<iostream>
    class base1
    {
    public:
        virtual void vn() {}
    privateint i;
    );
    class base2
    {
    publicvirtual void vf2(){}
    privateint j;
    );
    class derived:public base 1,public base2
    {
    public:
        virtual void vf3(){}
    privateint k;
    );
    void main()
    {
        derived d;
        base1 p1;
        base2 p2;
        p1=&d;
        p2 =&d;
        p1->vf1();
        p2->vf2();
    }

    如果一个类具有多个包含虚函数的父类,编译器会为它创建多个VIrtual table,每个virtual table中各个虚函数的顺序与相应的父类一样。

  • 相关阅读:
    完爆!用边缘容器,竟能秒级实现团队七八人一周的工作量
    手把手教你使用 cert-manager 签发免费证书
    手把手教你使用 Nginx Ingress 实现金丝雀发布
    Codeforces 534B Covered Path 贪心
    Codeforces 534A Exam 水
    Topcoder open 2015 Round 1A 250 Similars 枚举 + 状压
    Topcoder SRM 654 DIV1 500 FoldingPaper2 递归 + 枚举
    Topcoder SRM655 DIV2 250 BichromeBoard 水
    2015 Google code jam Qualification Round B 枚举 + 贪心
    2015 Google code jam Qualification Round A 水
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9277815.html
Copyright © 2020-2023  润新知