在C++中,在动态绑定期间,请考虑以下示例...
class Base
{
virtual void fun()
{
cout<<"Base";
}
};
class Derived : Base
{
void fun()
{
cout<<"Derived";
}
};
int main()
{
Base *bptr;
Derived d;
bptr=&d;
bptr->fun();
}
Run Code Online (Sandbox Code Playgroud)
由于虚拟关键字/动态绑定的声明,上述函数的输出是"Derived".
根据我的理解,将创建一个包含虚函数地址的虚拟表(Vtable).在这种情况下,为派生类创建的虚拟表指向继承的虚拟表fun().并且bptr->fun()将会得到解决,bptr->vptr->fun();.这指向继承的基类函数本身.我不完全清楚如何调用派生类函数?
我对虚拟表有一点疑问,每当编译器遇到类中的虚函数时,它就会创建Vtable并在那里放置虚函数地址.对于继承的其他类,它也会发生类似的情况.它是否在每个类中创建一个指向每个Vtable的新指针?如果不是,当创建派生类的新实例并将其分配给Base PTR时,它如何访问Virtual函数?