在C++中,在动态绑定期间,考虑以下示例...
class Base
{
virtual void fun()
{
cout<<"Base";
}
};
class Derived : public Base
{
void fun()
{
cout<<"Derived";
}
};
int main()
{
Base *bptr;
Derived d;
bptr=&d;
bptr->fun();
return 0;
}
由于声明了虚拟关键字/动态绑定,上述C++程序的输出为“派生”。
据我所知一个虚表(Vtable)将被创建,其中包含虚函数的地址。在这种情况下,为派生类创建的虚表指向继承的虚fun()
。而bptr->fun()
将被解析为bptr->vptr->fun();
。这指向继承的基类函数本身。我不完全清楚派生类函数是如何调用的?
3条答案
按热度按时间lqfhib0f1#
刚刚浏览了这个链接virtual table and _vptr
上面说工作流程会像。
因此,派生类的虚函数被称为..希望对你有帮助。
ddrv8njm2#
而bptr-〉fun()将被解析为bptr-〉vptr-〉fun();。这指向基类函数本身。
错误。
Derived
示例的vptr(每个示例中的隐藏字段)指向Derived
vtable。hi3rlvi23#
该标准并没有指定多态性的实现机制,它只说明了多态性应该如何工作,而不是编译器供应商应该如何实现多态性。
话虽如此,就Linux下的GCC和Windows下的MSVC而言,你已经做得很好了,我希望大多数其他编译器都是类似的。