zoukankan      html  css  js  c++  java
  • c++虚函数实现的一个直观例子

    一、memset一个对象
    这个是一个非常低级的错误,本身大家一看就看到这个代码是错误的,但是如果出现在面试题里,估计很多人会纠结一下,也可能会忽略这个问题。因为之前比较多的是用C语言,所以初始化一个结构的方法就是随手一个飘逸的memset一个结构。但是在C++中,这种方法可能会引起严重问题,特别的就是那些包含有虚函数的类实例。当然因为很多现实世界中出现的类中都包含有更多的复杂结构(例如vector等不透明结构),所以也不会有人这么做。只是这个操作的效果会比较有意思。
    二、测试例子
    [tsecer@Harry memsetvirtual]$ cat virobj.cpp 
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

    struct CWithVirtual {
    virtual void showself (void){
    printf("%s ",__FUNCTION__);

    };
    int main()
    {
        CWithVirtual myobj ,* myobjptr = & myobj;
        myobjptr->showself();
        memset(myobjptr,0,sizeof(myobj));
        myobjptr->showself();    
    }
    [tsecer@Harry memsetvirtual]$ g++ virobj.cpp -o virobj.cpp.exe
    [tsecer@Harry memsetvirtual]$ ./virobj.cpp.exe 
    showself
    Segmentation fault (core dumped)
    三、原因
    这个原因大家都知道,就是因为一个包含虚函数的对象的最开始4个字节是一个地址,指向的是一个虚函数表,而C++的多态特征也正是基于这个指针实现的。从这个地方可以展开C++的很多特征,包括一个对象的内存布局,一个对象的这个指针由谁来初始化,如何实现虚函数表的唯一性、new/delete的实现机制、new/delete的重载等。事实上,一个对象的运行时类型识别也同样是通过这个指针来实现,所以说指针是C语言族最为强大的一个机制,也是大家认为最为危险的一个机制。

  • 相关阅读:
    在浏览器上实时显示机械臂运动,treeJS机械臂运动
    Centrifuge在vue中基础使用,soket通讯
    Mxgrapheditor编辑器汉化
    ADrive在线网络存储(50G超大免费空间)
    Gmail邮箱为电脑减负,GMailStore网络硬盘开始亮剑
    全球最受欢迎的100个网站 [转载]
    第一次亲密接触读后感(转)
    Weaver博客地址更改通知 (http://blog.sina.com.cn/weaver)
    Javascript技巧(230个)[转载]
    教师精彩课堂用语50句
  • 原文地址:https://www.cnblogs.com/tsecer/p/10487382.html
Copyright © 2011-2022 走看看