重複の可能性:
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にいます」と2番目に「あなたはAにいます」を見た理由を理解できませんでした。A *b1 = new B(); と同じです。DoSmth(b1); // あなたは B にいます。なぜですか?