Когато си играя малко с полиморфизма, се опитах да направя нещо като следното:
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