虚函数中的疑点

虚函数中的疑问class A{public:virtual void f() {cout A::f() endl}}class B : public A{publi

虚函数中的疑问
class A
{
public:
virtual void f() {
cout << "A::f()" << endl;
}
};
class B : public A
{
public:
void f() {
cout << "B::f()" << endl;
}
};
int main(int argc, char* argv[])
{
A *pa = new A;
B *pb = (B*)pa;
pb->f(); // 调用A
}
我不理解的是,为什么派生类类型的指针指向基类后,调用的是基类中的A::f()。虽然f是虚函数,但pb是派生类指针。如果根据静态绑定的原则,那么应该是调用B::f()。求高手指教。

[解决办法]
因为你用的虚表是属于A的。
[解决办法]

探讨

因为你用的虚表是属于A的。

[解决办法]
探讨
class A
{
public:
virtual void f() {
cout << "A::f()" << endl;
}
};
class B : public A
{
public:
void f() {
cout << "B::f()" << endl;
}
};
int main(int argc, char* argv[])
{
A *pa = ne……

[解决办法]
http://blog.csdn.net/dazhong159/article/details/7906688
[解决办法]
探讨
引用:
引用:
楼上的我有点懂了,但是能说明的更详细一点么。产生这个结果究竟是根据什么样的原则,虚函数里只会提通过基类类型的指针或引用进行函数调用,会发生动态绑定。这个结果究竟是动态的还是静态的?

[解决办法]
探讨

引用:

因为你用的虚表是属于A的。

我觉得也是因为这个原因,但不是那么确定。

[解决办法]
我给你解释一把,反正吃饱了闲着没事。
首先,你new了 A,因为A有虚函数,所以编译器会给这个类产生一个虚表,并且在调用A的构造函数时,插入一个vptr(虚表指针)用以指向这个虚表。所有的虚函数在虚表的slot或者说索引是固定的,所以编译器在调用的时候都以vptr[index]来调用,具体调用哪个由运行时决定。OK,接下来说你的B *pb = (B*)pa;
这个只是强制类型转换,只是告诉编译器如何去解析从pa开始的一块内存(那么做可能会有问题,如果B比A大,那么越过的那段内存可能无法访问)。那么你通过 pb->vptr[1]调用的函数自然是A的,因为虚表是他的。