Немного поигравшись с полиморфизмом, я попытался сделать что-то вроде следующего:
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)
, либо изменить порядок наследования (2)
. Изменить. Эту проблему также может решить применение виртуального наследования. Таким образом, кажется, что порядок наследования или сопоставление влияет на vftable
. vftable
— это массив для отображений виртуальных функций-членов, также известный как. динамическое связывание в C++.
Поэтому я также просмотрел документацию Microsoft по C2369. где они показывают это в качестве примера, как воспроизвести эту ошибку:
int a[10];
int a[20]; // C2369
int b[20]; // OK
Другими словами, изменение порядка наследования меняет индекс этой таблицы?! Любые идеи?
virtual
наследование? en.wikipedia.org/wiki/Virtual_inheritance - person BoBTFish   schedule 02.07.2012vftable
. - person Christoph Meißner   schedule 02.07.2012