我从某些代码收到意外的输出:
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()
这是一个非常简单的例子。我的问题是:
我希望它会导致&#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()";
谢谢你:)
答案 0 :(得分:3)
虚拟函数通过对象本身工作。在A
或B
结构内部,有一些信息(通常称为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;
}