任何人都可以告诉我虚拟表和虚拟指针是按类还是按对象?如果它们是每个对象,为什么不能在同一个类的对象之间共享它们而不是为每个对象维护一个副本?
它是实现定义的,但它通常是每个类的静态vtable,并且每个实例都有一个vptr到类的vtable.每个实例需要指针的原因是因为编译器在编译时可能不知道特定变量将具体实现哪个,因此必须从引用确定性地访问指向相关vtable的指针.因此,有一个vtable的全部意义:)
对,就是这样。每个类都有一个虚拟表,否则就没有意义。虚拟指针什么都不是。不要使用这个术语!
只需扔掉您的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 */
}
Run Code Online (Sandbox Code Playgroud)
是的:使用普通C,您可以将函数指针分配给每个对象。但这与C ++中的虚函数不同。
| 归档时间: |
|
| 查看次数: |
3597 次 |
| 最近记录: |