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\n",__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语言族最为强大的一个机制,也是大家认为最为危险的一个机制。

posted on   tsecer  阅读(93)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示