可能重复:
C++ 中的切片问题是什么?
我有一个简单的代码作为多态性和继承的例子
class A
{
public:
int fieldInA;
void virtual overloadedFunc()
{
printf("You are in A\n");
}
};
class B : public A
{
public:
int fieldInB;
void overloadedFunc()
{
printf("You are in B\n");
}
};
void DoSmth(A* a)
{
a->overloadedFunc();
}
void DoSmthElse(A a)
{
a.overloadedFunc();
}
int _tmain(int argc, _TCHAR* argv[])
{
B *b1 = new B();
B b2;
//Breakpoint here
DoSmth(b1);
DoSmthElse(b2);
scanf("%*s");
return 0;
}
当我在断点处停止时,b1 的 _vfptr[0] 和 b2 的 _vfptr[0] 的值是相同的(SomeAddr(B::overloadedFunc(void)))。在 DoSmth() 中将 b1 作为参数传递后,局部变量 a 的 _vfptr[0] 仍然是 someAddr(B::overloadedFunc(void)),但 DoSmthElse 中 a 的 _vfptr[0] 现在是 someAddr(A::overloadedFunc(void) ))。我确定这是我对函数重载概念的一些误解,但我无法理解,为什么在第一种情况下我看到“你在 B 中”,而在第二种情况下看到“你在 A 中”。与 A *b1 = new B(); 相同 DoSmth(b1); // 你在B,为什么?