看代码:
#include <iostream>
using namespace std;
class B
{
public:
void mf(){
cout << "B::mf\n";
}
};
class D : public B
{
/*public:
void mf(){
cout << "D::mf\n";
}*/
};
int main()
{
D x;
B* pB = &x;
pB->mf();
D* pD = &x;
pD->mf();
getchar();
return 0;
}
结果:
在这段代码中,pB和pD调用的mf都是基类里面的mf()。不管他们的指针指向的是基类对象还是派生类对象。
再看下面的代码:
class B
{
public:
void mf(){
cout << "B::mf\n";
}
};
class D : public B
{
public:
void mf()
{
cout << "D::mf\n";
}
};
int main()
{
D x;
B* pB = &x;
pB->mf();
D* pD = &x;
pD->mf();
getchar();
return 0;
}
结果:
现在pD和pB调用的就是各自的mf了。造成这种行为的是,non-virtual函数如B::mf和D::mf都是静态绑定的。这句话的意思是,由于pB被声明为一个pointer-to-B,通过pB调用的non-virtual函数永远是B所定义的版本,即使pB指向一个类型为“B类派生的class”对象。
如果你在class D中重新定义继承自class B的non-virtual函数mf,当D对象调用mf时,任何一个D对象都可能表现出B或D的行为。决定因素不在对象自身,而在于 “指向该对象的指针类型”。References也会展现和指针一样难以理解的行径。