c++ - 为什么继承顺序或映射会影响 vftable 的下标? (适用于 C++ 的 VSC)

标签 c++ visual-studio-2010 polymorphism

在尝试使用多态性时,我尝试过如下操作:

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'}' : 重新定义;不同的下标 我不知道为什么会这样。有三种方法可以解决该错误:可以删除方法 (1) 或可以更改继承顺序 (2)编辑: 并且应用虚拟继承也可以解决它。所以似乎继承顺序或映射会影响 vftablevftable 是一个用于虚拟成员函数映射的数组 - 又名。 C++ 中的动态绑定(bind)。

因此我也查看了 microsofts documentation towards C2369他们以这个为例,如何重现该错误:

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

也就是说改变继承顺序改变了这个表的下标?!有什么想法吗?

最佳答案

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

class c : public a, public b

您面临的另一个问题是您继承自定义相同成员函数的 2 个类。 a::method 未映射到与 b::method 相同的地址!您的下一个问题可能是对“方法”的调用不明确...

关于c++ - 为什么继承顺序或映射会影响 vftable 的下标? (适用于 C++ 的 VSC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11291780/

相关文章:

C++ 多态性错误 : no matching function for call to

c# - C#中对象实例化左侧的抽象类

android - 使用 Android Studio 调试 C++ 库

c++ - 如何使用Qt/QwtPlot设置固定轴间隔?

c# - 使用 EnvDTE 创建表单后不会保存

c++ - 可视化数据库。表达式必须有指针类型

c++ - 如何入队和出队具有 QPoint 指针成员的类?

c++ - 统一初始化中的尾随逗号

asp.net - ASP 标签不再有 Intellisense Visual Studio 2010

haskell - 在 Haskell 中使用中间多态类型组合函数