zoukankan      html  css  js  c++  java
  • 看懂下面C++代码才说你理解了C++多态虚函数!

    #include <iostream>
    using namespace std ;
    class Father
    {
    private :
     virtual void Say()  //只有添加了virtual 关键字声明才会产生虚函数表 虚函数表在编译的时候确定  virtual是实现多态的关键
     {
       cout<<"Father::Say()"<<endl ;
     }
     virtual void Run()
     {
      cout<<"Father:Run()"<<endl;
     }

    };
    class Son :public Father
    {
    public:
     
      virtual void Run()  //派生类虚函数地址 替换父类函数地址在虚函数表中的位置  如需继续被集成那么 仍然要加上virtual
     {
      cout<<"Son:Run()"<<endl;
     }

       virtual void MakeLove()  //派生类也需要有virtual才有虚函数表函数   派生类只有声明了virtual才会把函数加入虚函数表
       {
         cout<<"Son::MakeLove();"<<endl;
       }

    };
    class SmallSon:public Son
    {
    public:
     virtual void Run()  //
     {
      cout<<"SmallSon:Run()"<<endl;
     }
     
    };
    typedef void(*Func)() ;  //定义一个函数类型定义
    void main()
    {
        Father fa;
     Func func=NULL ;
     cout<<"Virtual Table Address:"<<&fa<<endl ; 
     func=(Func)*((int*)*(int*)(&fa));//把对象首地址转换为int*防止翻转为对象 然后取出virtual table地址 然后在取出第一个虚函数的存放地址转换为int*
                                    //对象首地址存放虚函数表的地址 ,然后转换为int* 取出 虚函数表第一个函数 顺序是虚函数声明顺序
                                   //完全拜托了C++权限控制 这也是C++的缺陷
        func();
         func=(Func)*((int*)*(int*)(&fa)+1);

       func();
       Son son ;
       func=(Func)*((int*)*(int*)(&son));
       func();
       func=(Func)*((int*)*(int*)(&son)+1);
       func();
       func=(Func)*((int*)*(int*)(&son)+2);
       func();


       SmallSon sson ;
       ((Func)*((int*)*(int*)&sson))();
       ((Func)*((int*)*(int*)&sson+1))(); 

       //多层继承 一个表 多重继承多个表   表地址在 对象首地址开始存放

    }

  • 相关阅读:
    火狐浏览器看哪些地方加nofollow
    2017.6.14-网站分析
    2017.6.11-目标关键词优化 三个方面内容
    2017-6-9长尾关键词优化
    2017.6.7seowhy学习笔记---seo知识总纲
    使用 WordPress 自定义字段功能为文章添加下载按钮
    xftp和xshell有什么区别
    决定网站排名的6个干货
    转载:如何在wordpress主题中添加设置页面
    win10+ubuntu双系统安装方案
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3157404.html
Copyright © 2011-2022 走看看