可能重复:
为什么我需要虚拟表?
什么是C++中的vtAble?
要知道vtable是一个虚拟表,它有一个指向虚函数的指针数组.是否有一篇实际实施的文章?(任何走过将不胜感激)
以下链接示例:http://developer.kde.org/documentation/books/kde-2.0-development/ch03lev1sec3.html
#include <QObject>
#include <QPushButton>
#include <iostream>
using namespace std;
class MyWindow : public QWidget
{
Q_OBJECT // Enable slots and signals
public:
MyWindow();
private slots:
void slotButton1();
void slotButton2();
void slotButtons();
private:
QPushButton *button1;
QPushButton *button2;
};
MyWindow :: MyWindow() : QWidget()
{
// Create button1 and connect button1->clicked() to this->slotButton1()
button1 = new QPushButton("Button1", this);
button1->setGeometry(10,10,100,40);
button1->show();
connect(button1, SIGNAL(clicked()), this, SLOT(slotButton1()));
// Create button2 and connect button2->clicked() to this->slotButton2()
button2 = new QPushButton("Button2", this);
button2->setGeometry(110,10,100,40); …Run Code Online (Sandbox Code Playgroud) 在讨论密封类时,经常提到术语"虚函数表".究竟是什么?我刚才读到一个方法表(我不记得这个目的的目的)和谷歌/搜索这里带来了C++相关的结果.
谢谢
希望这对StackOverflow的问题不太专业:如果是,可以在其他地方迁移,请告诉我......
很久以前,我写了一篇本科毕业论文提出了C++和相关语言的各种devirtualization技术,一般是根据代码路径(有点像模板)预编译专业化的想法,但与检查,以选择正确的专长是在情况下,运行时选择它们不能在编译时选择(因为模板必须是).
(非常)基本的想法类似于以下内容...假设你有一个类C如下的类:
class C : public SomeInterface
{
public:
C(Foo * f) : _f(f) { }
virtual void quack()
{
_f->bark();
}
virtual void moo()
{
quack(); // a virtual call on this because quack() might be overloaded
}
// lots more virtual functions that call virtual functions on *_f or this
private:
Foo * const _f; // technically doesn't have to be const explicitly
// as long as it can be proven not be modified
}; …Run Code Online (Sandbox Code Playgroud) c++ compiler-construction virtual-functions vtable compiler-optimization
我试图理解书中有效的c ++语句.以下是多继承的继承图.


现在这本书说vptr需要每个类中的单独内存.它也做了以下声明
上图中的一个奇怪之处在于,即使涉及四个类,也只有三个vptrs.如果愿意,实现可以自由地生成四个vpt,但是三个就足够了(事实证明B和D可以共享一个vptr),并且大多数实现利用这个机会来减少编译器生成的开销.
我看不出有什么理由为什么每个类都要求为vptr提供单独的内存.我理解vptr是从基类继承的,可能是继承类型.如果我们假设它显示了带有继承的vptr的结果内存结构,那么它们如何才能生成该语句
B和D可以共享vptr
有人可以在多重继承中澄清一下vptr吗?
我知道这听起来很傻,我知道C不是面向对象的语言.
但有没有办法在C中实现动态方法调度?我考虑过函数指针,但没有得到完整的想法.
我怎么能实现这个?
假设我有以下代码
void f(PolymorphicType *p)
{
for (int i = 0; i < 1000; ++i)
{
p->virtualMethod(something);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器生成的代码解除引用p的vtable条目是virtualMethod1次还是1000次?我正在使用Microsoft的编译器.
编辑
这是我正在查看的真实世界案例的生成程序集. line->addPoint()是虚拟的关注方法.我没有装配经验,所以我慢慢地过去了...
; 369 : for (int i = 0; i < numPts; ++i)
test ebx, ebx
je SHORT $LN1@RDS_SCANNE
lea edi, DWORD PTR [ecx+32]
npad 2
$LL3@RDS_SCANNE:
; 370 : {
; 371 : double *pts = pPoints[i].SystemXYZ;
; 372 : line->addPoint(pts[0], pts[1], pts[2]);
fld QWORD PTR [edi+8]
mov eax, DWORD PTR …Run Code Online (Sandbox Code Playgroud) 接口(仅具有纯虚函数的多态类)是否具有vtable?由于接口本身不实现多态函数并且不能直接构造,因此链接器不需要放置vtable.是这样吗?我特别关注MSVC编译器.
包含一个或多个虚函数的每个类都有一个与之关联的Vtable.一个名为vptr的void指针指向该vtable.该类的每个对象都包含指向同一Vtable的vptr.那为什么vptr不是静态的呢?而不是将vptr与对象相关联,为什么不将它与类关联?

我很好奇,如果标记现有的派生C++类final以允许去虚拟化优化将在使用C++ 11时改变ABI.我的期望是,它应该有没有影响,因为我认为这主要是提示编译器有关它如何能够优化虚函数,因此我看不到任何方式,它会改变结构或V表的大小,但也许我错过了什么?
我知道这里更改API,以便从这个派生类进一步派生的代码将不再起作用,但我只关注这个特殊情况下的ABI.