gpt4 book ai didi

c++ - 函数重载和虚方法表

转载 作者:太空宇宙 更新时间:2023-11-04 16:24:22 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
What is the slicing problem in 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(); 相同做史密斯(b1);//你在B,为什么?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com