2

在玩一点多态性时,我尝试执行以下操作:

class a { virtual void method() { } };
class b { virtual void method() { } };
class c : public a, b {
    virtual void method() { }
    virtual void anotherMethod() { } // (1)
};
class d : public c, a, b // (2)
{ virtual void method() { } }; // C2369

据我所知,这应该没有任何问题。但是编译器告诉我: error C2369: 'const d::'vftable'{for 'a'}' : redefinition; different subscripts 我不知道为什么会这样。有三种方法可以解决该错误:可以删除方法或更改 (1)继承顺序。编辑:并且应用虚拟继承也可以解决它。因此,似乎继承顺序或映射会影响. 这是一个用于虚拟成员函数映射的数组 - 又名。C++中的动态绑定。(2)vftablevftable

因此,我还查看了针对 C2369 的 microsoft 文档,他们将其作为示例显示,如何重现该错误:

int a[10];
int a[20];   // C2369
int b[20];   // OK

换句话说,改变继承顺序会改变这个表的下标?!有任何想法吗?

4

1 回答 1

0

默认情况下,类是私有继承的(与结构相反)!因此“c”只能从“a”公开继承!您在那里缺少另一个公共关键字:

class c : public a, public b

您面临的另一个问题是您从定义相同成员函数的 2 个类继承。a::method 没有映射到与 b::method 相同的地址!您的下一个问题可能是,对“方法”的调用是模棱两可的......

于 2012-07-02T10:45:43.463 回答