我们可以让一个vtable共享我的多个类吗 < C++有可能有多个类共享一个VTH吗? 根据我的理解,如果一个类有一个虚拟函数,那么它将生成一个vtable。因此每个类都应该有自己的vtable。

我们可以让一个vtable共享我的多个类吗 < C++有可能有多个类共享一个VTH吗? 根据我的理解,如果一个类有一个虚拟函数,那么它将生成一个vtable。因此每个类都应该有自己的vtable。,c++,vtable,C++,Vtable,Vtables是一个实现细节。C++没有VTABLE,它具有虚拟函数。Vtables恰好是最常见的(如果不是唯一的)实现,并且细节不同 您真正想要实现的是什么?多态性可以通过多种方式实现。vtables也可以通过多种方式实现。但通常在下列情况下 class A { virtual foo(){} } class B : public A { virtual foo(){} } class C : public B { void fooNonVirtual(){}; }

Vtables是一个实现细节。C++没有VTABLE,它具有虚拟函数。Vtables恰好是最常见的(如果不是唯一的)实现,并且细节不同


您真正想要实现的是什么?

多态性可以通过多种方式实现。vtables也可以通过多种方式实现。但通常在下列情况下

class A {
    virtual foo(){}
}

class B : public A {
    virtual foo(){}
}

class C : public B {
    void fooNonVirtual(){};
}
B
C
应具有相同的vtable

例如:

A *a = new A;
B *b = new B;
C *c = new C;
a->foo(); // A::foo is called
((A*)b)->foo(); // B::foo is called
((A*)c)->foo(); // B::foo is called
foo
for
a
b
调用不同的方法,因为a和b具有不同的vtable。对于
b
c
调用相同的方法。所以编译器可以进行一些优化,只为B和C类创建一个vtable

foonvirtual
不是虚拟的,根本不需要vtables。

您可以这样做

typedef some::Class AnotherClass;
然后这些类将共享


此外,继承可能——至少在理论上——导致vtable的共享。

vtable基本上是一个虚拟函数表,因此如果两个类具有相同的虚拟函数,那么共享vtable似乎非常简单

struct Class1
{
    virtual void func() { /* whatever */ }
};

struct Class2 // can share the vtable with Class1
{
    void nonvirtual_func() { /* whatever */ }
};

但是,vtable还可能包含其他信息(例如,
typeid
返回的内容)-在这种情况下,无法共享vtable。一些编译器有一个选项来禁用RTTI和
typeid
——这样设置可能会影响问题的答案。

问题的答案并不清楚。一个班级可以 根据使用方式,有许多不同的
vtable
。及 编译器将合并中几个类的vtable 等级制度。例如:

struct VB { virtual ~VB() = default; };
struct L : virtual VB {};
struct R : virtual VB {};
struct D : L, R {};
在这种情况下,
VB
的vtable将不同 取决于您是实例化
L
R
还是实例化
D
。 另一方面,在派生类型最多的对象中,
D
和基类
L
可能共享相同的
vtable

有人在采访中问我是否可以让vtable由多个班级共享,我说不行。所以我只是想知道实际答案是什么。正确的答案是理论上是可能的,只是因为这是一个实现细节。我讨厌这种采访问题。事实上的答案是,作为程序员,您不能强制这样做,但编译器可以自由共享相同的vtable。(但如果编译器像我所知道的那样,将指针指向vtable的动态类型信息部分,那么就不会发生这种情况。)@SebastianRedl也许这项工作涉及实现编译器、调试器或其他低级黑客——那么这可能是一个好方法question@anatolyg授予,如果对C++内部结构的强烈理解是一项工作要求,那么这是一个合理的问题。在所有其他情况下,这意味着我认为是一种有问题的心态——要么是喜欢琐事,要么是缺乏对全局的关注。所以这意味着,如果基类和派生类共享同一组虚拟函数,那么编译器可能会强迫它们使用相同的vtable?是的,你是对的。我已经更新了答案(添加了
void foonvirtual(){};
),使其更加明显。但是我觉得类A和类B应该有相同的vtable,而不是B和C
A
B
不可能有相同的vtable,因为它们的
foo
函数项需要指向两个不同的位置。单个表中的单个插槽不能有两个不同的值,因此
A
B
必须有两个单独的表<另一方面,code>C从
B
继承了它的
foo
实现,因此可以想象
B
C
可以共享一个vtable。这取决于编译器实现选择存储在vtables中的其他内容。Avt,是否有一些代码可以使用
A
B
C
的定义来执行,以证明它们中哪些具有相同的vtables?我在这里有点困惑,正如@Avt所提到的,A类和B类共享相同的一组虚拟函数,因此它们也可以共享相同的vtable?我认为它们不能,因为函数确实不相同(它们有相同的实现,但它们的地址必须不同),但我不确定这一点事实上,这甚至不会创建第二个类,因此仍然只有一个类。此类仅与其自身共享其vtable。(typedef只为名称创建别名,而不是新类型。因此某些::Class和另一个类仍然引用相同的类型。)@anderas请放心,我写这篇文章时就知道了这一点。您可以支持另一个名称建立另一个类的观点(!),至少在某种逻辑上是这样的。最后,针对实现细节的技巧性问题应该得到技巧性的回答。