C++虚函数表解析 (Lawliet 修改+注释版)(附有部分网友的重要评论)
Feedback
写的很好!
------------------
"所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法"
可以修改成 "所谓泛型技术,说白了就是试图使用不变的 接口 来实现可变的算法", 这样更具有设计概念.
回复 更多评论
# re: C++虚函数表解析(转) 2009-03-25 23:35 江湖飘
在有虚函数的类的实例中这个表被分配在了 这个实例的内存中
这句话要更正一下:
一个类的虚函数表是静态的,也就是说对这个类的每个实例,他的虚函数表的是固定的,不会为每个实例生成一个相应的虚函数表。 回复 更多评论
# re: C++虚函数表解析(转) 2009-05-04 15:09 猪头三
@江湖飘
我试了一下,用两个实例,用楼主的方法取得虚函数表的地址,返回的地址不一样,请问是什么原因呢? 回复 更多评论
# re: C++虚函数表解析(转) 2009-05-14 13:46 王平
小标题“一般继承(无虚函数覆盖)”下面的重载改为重写较为合适,分别对应于英文的override和overload,重载就是所谓的名同而签名不同,重写就是对子类对虚函数的重新实现。 回复 更多评论
# re: C++虚函数表解析(转) 2009-05-14 14:41 王平
这篇文章图文并茂,使用一种深入浅出的方式阐述了c++虚函数表的机制,同时还对这种方式的弊端做出了总结,实在是一篇不可多得的文章。
但是,不难发现,在文章中还是能够发现一些较为明显的错误,这个上面的评论者已经提出,在此就不赘述。
虽然这篇文章存在错误,但是瑕不掩瑜,楼主只要稍作修改,此篇文章便可堪称一绝,况楼主在此过程中还能够学到新的东西,望楼主再接再厉,多听听读者的意见。 回复 更多评论
# re: C++虚函数表解析(转)[未登录] 2009-05-30 16:18 sky
问一个问题,(int*)(&b) 得到的是虚拟函数表的位置么?怎么感觉是指向虚拟函数表的指针的位置呢? *(int*)(&b) 才是虚拟函数表的位置吧? 回复 更多评论
# re: C++虚函数表解析(转) 2009-06-12 16:53 zhangwh
非静态成员函数的调用都需要绑定一个对象指针(this),
请问:
pFun = (Fun)*((int*)*(int*)(&b));
pFun();
调用void Base::f()函数时,this指针指向什么?
回复 更多评论
# re: C++虚函数表解析(转) 2009-09-15 15:51 coolpoint
这个写得太精彩了 回复 更多评论
# re: C++虚函数表解析(转)[未登录] 2009-09-16 10:16 smart
b1->f1(); //编译出错
应该是b1->g1(); //编译出错 吧
因为Base1的虚表中有Derive的虚函数有f()和g1(),f()重载了B1,而g1()没有,所以b1->g1(); //编译出错 吧 回复 更多评论
# re: C++虚函数表解析(转) 2009-09-22 12:58 虚怀若谷
如果加上多重继承中虚继承的分析就更好了。
# re: C++虚函数表解析(转) 2009-10-05 11:21 程少伟
同意你的观点哈,因为虚函数表的指针放在对象的前面,所以(int*)(&b)其实是对象的首地址, 也就是对象中存放虚函数指针的地方,用* 解引用才能访问虚函数表,我的理解是这样的,@sky
另外,b1->g1() 编译可以通过, 在我的VS2008 环境下可以
@smart
回复 更多评论
# re: C++虚函数表解析(转) 2010-03-07 20:59 Coastline
请问博主,如何运行时获知虚函数表中有多少个函数指针呢,难道只能一个一个遍历,发现NULL或者1?
我主要是想在无RTTI的平台上实现如下功能:
class C: public A,public B
现在将C* ---> void* 后,需要调用到C中B部分的虚函数。我只想到处理虚函数表一个解决方法了。希望博主能指点
IBN#live.com
# re: C++虚函数表解析(转)[未登录] 2010-04-20 23:13 jeff
(Fun)*((int*)*(int*)(&b)+0); // Base::f()
(Fun)*((int*)*(int*)(&b)+1); // Base::g()
(Fun)*((int*)*(int*)(&b)+2); // Base::h()
在vs2005 下没有运行结果啊,
pFun =(Fun)*((int*)*(int*)(&b)+1);
pFun();
这样就可以。为什么啊
回复 更多评论
# re: C++虚函数表解析(转) 2010-04-25 10:01 snow_man2004
写得很好,思路很清晰,透彻,谢谢! 回复 更多评论
# re: C++虚函数表解析(转) 2010-05-12 10:56 yanle
@zdwsj
@sky
言之是理。(int*)(&b)不是虚函数表的地址,而是实例中虚函数表指针的地址才对。而(int*)*((int*)(&b))才应该是虚函数表的首地址,也是第一个虚函数的地址。 回复 更多评论
# re: C++虚函数表解析(转) 2010-06-12 18:46 没名字
例子说明有点问题:
typedef void(*Fun)(void);
Base b;
Fun pFun = NULL;
cout << "虚函数表地址:" << (int*)(&b) << endl; // 错了,这应该是B的实例对象的地址。
cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
// 因为虚表放在最前面,这次取到的才是虚表的地址。
pFun = (Fun)*((int*)*(int*)(&b)); // 这个才是第一个虚函数的地址
另,虚表是属于类的,同一类的实例共享一个虚表,所以虚表不是在实例的内存中。 回复 更多评论
# re: C++虚函数表解析(转) 2010-07-29 18:45 凋零的羽
@没名字 你确定吗? 我看这个看了一下午这个例子,总觉得说的自相矛盾。然后自己得出的结论正好是跟你一样的。。。也就是如你所说的,第一次取的是实例对象地址,第二次取的才是虚表地址,这样我就能看通了。。。
回复 更多评论
# re: C++虚函数表解析(转)[未登录] 2010-08-25 00:26 123
里面有些概念是错误的 回复 更多评论
# re: C++虚函数表解析(转) 2010-08-26 17:04 ccnlzp
太过肤浅了,没有说出问题的实质。
而且不同意做的批判。因为最终数据放内存里,你想,怎么玩什么语言都难以阻拦. 回复 更多评论
# re: C++虚函数表解析(转)[未登录] 2010-08-27 00:25 sam
虚函数表的第一项不是一个为了支持RTTI的指针吗?然后才是虚函数。
现在这里为什么第一项是虚函数?编译器做了动作?请问楼主在什么环境下试验的? 回复 更多评论
# re: C++虚函数表解析(转) 2010-09-12 20:31 Liyx
如果能再讨论一下虚继承下的情形就好了。对D类的大小不太理解。
class A
{
};
class B
{
};
//sizeof(C)=4
class C:virtual public A, public B
{
};
//sizeof(D)=8
class D:virtual public A, virtual public B
{
};
================================
class A
{
virtual void funca(){};
};
class B
{
virtual void funcb() {};
};
//sizeof(C)=4
class C:virtual public A, public B
{
};
//sizeof(D)=12
class D:virtual public A, virtual public B
{
}; 回复 更多评论
# re: C++虚函数表解析(转) 2010-09-19 14:30 vmlinz
@没名字
实例会有类的指针 回复 更多评论
# re: C++虚函数表解析(转) 2010-09-21 15:58 simophin
多谢楼主的好文章,这文章非常棒,解决了我很多疑问。
但是我对你的批判有一些看法,很多C++等的安全限制等个人感觉只是“编译时”除错、保证规则用的,你非要说运行时类似安全问题,你一个指针访问进程地址空间的哪一部分不可以?你只要知道了内存布局,无论是C还是C++还是C+++,不都一样地访问吗?所以这并非C++的错。 回复 更多评论
# re: C++虚函数表解析(转) 2010-10-09 16:14 solu
第一次看你这篇文章时,看不懂;
第二次看你这篇文章时,感觉写的太好了,叹为高人;
第三次看你这篇文章时,感觉作者你对某些方面了解得不够,有些地方很是糊囵吞枣,知其然不知其所以然。 回复 更多评论
# re: C++虚函数表解析(转) 2011-04-03 21:35 zhanglibin
一事不明,
抽象类生不生成虚表? 回复 更多评论
# re: C++虚函数表解析(转)[未登录] 2011-07-22 13:02 小四
(int*)(&b)得到的不是虚函数表的地址吧,仅仅是实例b的地址。虚函数表的地址应该是对该地址对应的内容,即*(int*)(&b)。 回复 更多评论
# re: C++虚函数表解析(转) 2011-10-05 21:59 天外一星
有指针指向首地址,虚函数表后有结束标记,因此无需知道长度@小熊
回复 更多评论
# re: C++虚函数表解析(转) 2012-02-25 15:20 寝室没电
@zhangwh
这位说的很OK
(int*)(&b)) 同等于 this指针 回复 更多评论
|
C++虚函数表解析 (Lawliet 修改+注释版)(附有部分网友的重要评论)相关推荐
- C++ 虚函数表解析
转载自 https://blog.csdn.net/zhou191954/article/details/44919479 C++ 虚函数表解析 前言 C++中的虚函数的作用主要是实现了多态的机制.关 ...
- C++ 虚函数表解析 继承
C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父 ...
- 基本语言细节---C++ 虚函数表解析 陈皓
C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父 ...
- C++对象的内存布局1---基础篇----C++ 虚函数表解析
[-] 前言 虚函数表 一般继承(无虚函数覆盖) 一般继承(有虚函数覆盖) 多重继承(无虚函数覆盖) 多重继承(有虚函数覆盖) 安全性 结束语 附录一:VC中查看虚函数表 附录 二:例程 前言 C++ ...
- C++虚函数表解析(转) ——写的真不错
C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态" ...
- C++虚函数及虚函数表解析
一.背景知识(一些基本概念) 虚函数(Virtual Function):在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数. 纯虚函数(Pure Virtual Functi ...
- C++ 虚函数表解析(转)
前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态&q ...
- Android SO逆向-C++虚函数表解析
0x00 一般继承(无虚函数覆盖) class Base {public:Base() { ALOGD("Base ..."); }virtual void f() { ALOGD ...
- Java中final、finally、finalize的简单区别,中等区别,详细区别(Lawliet 修改+注释版)
简单区别: 中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联: final:java中的关键字,修饰符. 1.如果一个类被声明为final,就意味着它不能再派生出新的 ...
最新文章
- 赔得比赚得多,职场人年终奖都花哪儿了?
- 【数字信号处理】基本序列 ( 正弦序列 | 数字角频率 ω | 模拟角频率 Ω | 数字频率 f | 模拟频率 f0 | 采样频率 Fs | 采样周期 T )
- Golang适合高并发场景的原因分析
- KubeVela:标准化的云原生平台构建引擎
- mysql+after+commit_Spring事务aftercommit原理及实践
- ELV局部视图与差分隐私【敏感度到底怎么理解】【上】
- ajax连接前后端原理,前后端数据交互方法和原理
- 怎么用python算单价和总价_用python计算最高投标限价
- Eclipse热部署JSP
- GTF - Great Teacher Friedman
- 如何用OD的跟踪功能分析虚拟机保护
- VoLTE业务端到端流程:无线侧信令流程
- android 自定义太阳,第一个AOSP安卓10自定义ROM已经可用,并且非常稳定
- 能让你脱颖而出的简历应该这么写
- 将一个给定的 n×n 方阵转置(行列互换)
- linux acl权限是什么意思,Linux ACL是什么意思
- Android手机存储路径
- 好想与你天长地久,共度岁月
- 【Flask】篇一:Error: Failed to find Flask application or factory in module “学习用“. Use “FLASK_APP=学习用:nam
- 基于Bert文本分类进行行业识别