任何人都可以告诉我虚拟表和虚拟指针是按类还是按对象?如果它们是每个对象,为什么不能在同一个类的对象之间共享它们而不是为每个对象维护一个副本?
答案 0 :(得分:6)
它是实现定义的,但它通常是每个类的静态vtable,并且每个实例都有一个vptr到类的vtable。每个实例需要指针的原因是因为编译器在编译时可能不知道特定变量将具体实现哪个,因此必须从引用确定性地访问指向相关vtable的指针。因此,有一个vtable的重点:)
答案 1 :(得分:5)
是的确切。虚拟表是每个类,否则没有意义。虚拟指针什么都不是。不要使用这个词!
抛弃你的C ++并思考它将如何在C中实现:
typedef VirtualFunctionsOfAClass AClassesVTable
struct AClass {
some_data
AClassesVTable *vptr;
};
struct VirtualFunctionsOfAClass {
int(*someFunc1)(struct AClass* _This, int a);
int(*anotherFunc1)(struct AClass* _This, int a);
};
static AClassesVTable vtableOfClassA = {func1, func2};
struct AClass* constructAClass() {
AClass* ac=malloc(sizeof(AClass));
ac->vptr = &vtableOfClassA;
return ac;
}
void aNonVirtualMemberFunctionOfClassA(AClass* _This, more arguments)
{
return; /* just a dummy */
}
是的:使用普通C,您可以为每个对象分配函数指针。但这与C ++中的虚函数不同。
答案 2 :(得分:1)
虚拟表是每个类。虚拟指针是每个对象。见http://www.go4expert.com/articles/virtual-table-vptr-t16544/