为什么使用虚拟表来解析函数调用?
在下面我理解编译器验证指针赋值
A *p_a = &b;
知道它指向派生类对象。但为什么需要虚拟表来解析函数调用?
class A
{
public:
A():x(1){}
virtual void getX() {cout << x << endl;}
private:
int x;
};
class B : public A
{
public:
B() : A(),x(2){}
void getX() {cout << x << endl;}
private:
int x;
};
int main()
{
B b;
A *p_a = &b;
p_a->getX();
}
没有找到相关结果
已邀请:
5 个回复
马口
该调用无法在编译时解决。或者一个单独编译的模块,它有一个方法取一个
,但它对
一无所知;或者包含你对它一无所知的子类
,它会让你回到
?最终,vtable是对象类的唯一运行时表示。
蜂佬渺
的确切类型。 通常编译器不会有那么多信息,它只有一个指向
对象的指针,但不知道指向对象的派生类型是什么。那是必须使用虚拟表的时候。基本上,存储在每个多态对象中的虚拟表指针包含最终对象的类型信息,特别是每个方法的
。
烷刨画颠离
炬卤遁蝎变
坍锭嘉韭蓝