zoukankan      html  css  js  c++  java
  • [置顶] 关于虚函数的一个有趣的故事跟大家分享下。

       前段时间由于保研机试的需要各种练ACM,加了个九度的什么高级机试群,聊天的过程中,突然出现了一位目空一切的“高手”,争吵之余撂下一段代码,说是不编译直接说出结果,拿来之后,在纸上仔细分析了一番,现在把分析结果与各位看官共享一下。

     代码:

    #include <iostream>
    using namespace std;
    
    class	IHello{
    public:
    	virtual void Hello()= 0;
    };
    
    class	IWorld{
    public:
    	virtual void World()= 0;
    };
    
    class HelloWorld:public IHello, public IWorld{
    public:
    	virtual void Hello(){
    		cout<<"Hello"<<endl;
    	}
    	virtual void World(){
    		cout<<"World"<<endl;
    	}
    };
    
    int main(){
    	IHello* hello = new HelloWorld;
    	IWorld* world = (IWorld*)(void*)hello;
    	world->World();
    }


    问题:请问输出结果是什么?

    答: Hello

    解析:

    这里为什么会是Hello,解释一下:
    IHello* hello = new HelloWorld;
    这是面向对象中经常会使用的一种使程序呈现多态性的手段,也就是动态联编,只有运行时才知道具体执行的代码,这里面的子对象HelloWorld在生成对象时会从对象初始地址开始建立一个虚函数表,用来保存虚函数的地址,也即第一个地址指向Hello(),第二个地址保存World(),继承时,HelloWorld对象的虚函数表指针则将相应的指针指向其覆盖的函数,但是虚函数地址的相对位置还是Hello()在前,World()在后,在用IWorld进行强转之后,world指向了HelloWorld的入口虚函数地址,当执行world->World();
    时实际上是转去执行Hello函数去了。

  • 相关阅读:
    如何高效查看 Docker 日志
    linux:有效使用docker logs查看日志
    FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
    性能调优
    【禅道】Windows本地安装禅道2.0.9
    Handle
    Operate the elements
    Web功能测试常用方法
    Drop down box selection(Select)
    Iframe
  • 原文地址:https://www.cnblogs.com/pangblog/p/3290126.html
Copyright © 2011-2022 走看看