虚函数调用和转换

virtual function calls and casting

我从这样的代码中收到意外输出:

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()

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

我预计它会导致 "A::foo()"

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

谢谢你:)

主要功能应如下所示:

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

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

    delete a;
}

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

这就是要点,您想要调用属于与实际指针类型不同的某个对象的函数(通常是 "base"-class,其中你有多个派生 classes).

要强制调用 A::foo,您可以调用(相当笨拙的语法):

a->A::foo()

但一般来说,如果您这样做,我会说 "you're doing it wrong" - 这不是您应该使用虚函数的方式。