虚函数调用和转换
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()
这是一个非常简单的例子。我的问题是:
- 为什么第二次调用 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;
}
虚函数通过对象本身工作。在 A
或 B
结构中,有一些信息(通常称为 vtable
),其中包含指向虚函数的指针,在本例中为 foo
.
这就是要点,您想要调用属于与实际指针类型不同的某个对象的函数(通常是 "base"-class,其中你有多个派生 classes).
要强制调用 A::foo
,您可以调用(相当笨拙的语法):
a->A::foo()
但一般来说,如果您这样做,我会说 "you're doing it wrong" - 这不是您应该使用虚函数的方式。
我从这样的代码中收到意外输出:
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() 打印 "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;
}
虚函数通过对象本身工作。在 A
或 B
结构中,有一些信息(通常称为 vtable
),其中包含指向虚函数的指针,在本例中为 foo
.
这就是要点,您想要调用属于与实际指针类型不同的某个对象的函数(通常是 "base"-class,其中你有多个派生 classes).
要强制调用 A::foo
,您可以调用(相当笨拙的语法):
a->A::foo()
但一般来说,如果您这样做,我会说 "you're doing it wrong" - 这不是您应该使用虚函数的方式。