C++中是否每个类(有虚函数)都对应一个virtual function table?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中是否每个类(有虚函数)都对应一个virtual function table?相关的知识,希望对你有一定的参考价值。
我在网上看说是子类和父类共享一个virtual function table 我觉得不对啊。应该是子类和父类各有一个vtable.并且自己的vptr 指向自己的vtable
求指点
子类先是从父类复制了一个虚函数表,如果子类对父类的虚函数进行了覆盖,则在子类的虚函数表将会用子类的函数地址覆盖父类的,如果没有覆盖,则还是使用父类的函数地址,这样就实现了多态。 参考技术A 有虚函数的类比一般类要多出4个字节的长度,这4个字节存放的是虚表的地址。
如果子类中对父类的虚函数重写了,子类的地址就指向自己的虚表,如果没有重写,就和父类共同指向一个虚表。
c++迭代器在迭代向量时崩溃
【中文标题】c++迭代器在迭代向量时崩溃【英文标题】:c++ Iterator crashing while iterating over vector 【发布时间】:2014-01-06 15:52:06 【问题描述】:我有一个类Iformat,它有虚函数operator(),每个派生类都实现了这个函数。
class myClass
std::vector<IFormat*> formatList_;
public:
void formatAll()
foreach(IFormat* format , formatList_)
(*format)();
;
formatAll
函数在 myClass
的对象上调用,然后在循环中,operator()
函数正在删除这个 myClass
对象本身,该对象调用了导致崩溃的 formatAll()
函数迭代器正在损坏。
约束:不能声明operator()
定义否则返回错误类型。
此外,不能使用某些指标变量来跳出循环。
有人可以建议处理循环的方法,这样它就不会通过仅更改循环和迭代器并遵循约束来崩溃。 谢谢
【问题讨论】:
如果没有更多上下文,我认为我们无法解决这个问题。看起来你已经在某个地方搞砸了内存管理,但你本可以在任何地方搞砸。如果格式的 () 运算符正在删除父级,那么您显然没有很好地定义所有权... 最好的办法是用一个小例子来复制问题。从较大的程序中提取足够的内容来制作一个小示例,您可以发布该示例来演示该问题。通常,您会在处理该问题时自己发现问题。如果没有,那么您可以发布一个示例,其他人可以编译并帮助您调试。 你正在调试的testcase在哪里? 【参考方案1】:是的,有时由于回调产生复杂的操作链,这个问题可能会浮出水面。
你有几个选择:
在formatAll
中复制formatList_
并遍历该副本;您只是在复制指针,但如果容器很大,或者您在某个地方的紧密循环中运行它,这可能仍然是不可取的;
在事件驱动的框架中,你可以推迟(*format)()
的执行直到下一个应用程序“tick”开始,在这个循环中只将它添加到一些工作队列中;这实际上与选项 #1 相同,只是要复杂得多,但如果您确实拥有这样的框架,它可以非常好地插入;
以某种方式确保回调不能直接或间接修改formatList_
;您可以通过禁止“添加”或“删除”选项或强制那些被推迟来实现这一点。
“最干净”的方法是选项 #3,但同样,除非您处于事件驱动的框架中,否则实施起来可能很笨拙。
【讨论】:
以上是关于C++中是否每个类(有虚函数)都对应一个virtual function table?的主要内容,如果未能解决你的问题,请参考以下文章
C++反汇编第三讲,反汇编中识别继承关系,父类,子类,成员对象