gpt4 book ai didi

c++ - 匿名类上的虚拟表

转载 作者:IT老高 更新时间:2023-10-28 23:19:11 26 4
gpt4 key购买 nike

我的代码中有类似的东西:

#include <iostream>
#include <cstdlib>

struct Base
{
virtual int Virtual() = 0;
};

struct Child
{
struct : public Base
{
virtual int Virtual() { return 1; }
} First;

struct : public Base
{
virtual int Virtual() { return 2; }
} Second;
};

int main()
{
Child child;
printf("ble: %i\n", ((Base*)&child.First)->Virtual());
printf("ble: %i\n", ((Base*)&child.Second)->Virtual());

system("PAUSE");
return 0;
}

我希望这会给出这样的输出:

ble: 1
ble: 2

在 GCC(我相信是 3.4.5)下编译时会这样做。

然而,在 Visual Studio 2008 下编译和运行它会得到:

ble: 2
ble: 2

有趣的是,如果我给 Base 派生的结构命名(struct s1 : public Base),它可以正常工作。

哪种行为(如果有)是正确的? VS 只是拘谨,还是遵守标准?我在这里错过了什么重要的东西吗?

最佳答案

这似乎是 VS 2008 中的一个错误,可能是因为它覆盖或忽略了第一个未命名类的 vtable 以支持第二个类的 vtable,因为内部名称相同。 (当您明确命名一个时,vtable 的内部名称不再相同。)

据我从标准中可以看出,这应该可以按您的预期工作,并且 gcc 是正确的。

关于c++ - 匿名类上的虚拟表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2082339/

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