虚函数调用和转换

时间:2015-01-10 13:47:53

标签: c++ virtual

我从某些代码收到意外的输出:

struct A
{
    virtual void foo(){ std::cout << "A::foo()\n";
};

struct B : A
{
    virtual void foo(){ std::cout << "B::foo()\n";
};

int main()
{
    A* a = new B;

    a->foo();
    (static_cast< A* >( a ))->foo( );

    delete a;
}

输出是:

B::foo()
B::foo()

这是一个非常简单的例子。我的问题是:

  • 为什么第二次调用foo()打印&#34; B :: foo()&#34;?

我希望它会导致&#34; A :: foo()&#34;

auto ptr = static_cast< A* >( a );  
// ide :: ptr is of type A*
// a call to ptr->foo() still reults in "B::foo()";
谢谢你:)

2 个答案:

答案 0 :(得分:3)

虚拟函数通过对象本身工作。在AB结构内部,有一些信息(通常称为vtable),其中包含指向虚拟函数的指针,在本例中为foo

这就是一点,你想要调用属于某个对象的函数,该函数与实际指针的类型不同(通常是&#34; base&#34; -class,你有多个派生类)。

要强制拨打A::foo,你会打电话(相当尴尬的语法):

a->A::foo()

但一般情况下,我会说'#34;你做错了&#34;如果你做那种事 - 那不是你应该如何使用虚函数。

答案 1 :(得分:1)

主要功能如下:

int main()
{
    A* a = new B;

    a->foo();
    a->A::foo();

    delete a;
}