Пытаюсь скомпилировать примерно такой код:
#include <stdio.h>
class base {
public:
virtual base * clone() { printf("BASE\n"); return NULL; }
};
class left_derived : public virtual base {
public:
virtual left_derived * clone() { printf("LEFT DERIVED\n"); return NULL; }
};
class right_derived : public virtual base { };
class derived : public right_derived, public left_derived { };
int main() {
base * b = new derived;
b->clone(); // LEFT DERIVED
}
Этот код не переварил ни один из компиляторов, которые мне удалось найти:
MSVC 7.1.6030: fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 2708)
gcc (GCC) 3.4.4 (cygming special): bug.cpp:8: sorry, not implemented: adjusting pointers for covariant returns
Digital Mars 8.42n: bug.cpp(18) : Error: covariant return type of 'left_derived::clone' with multiple inheritance not implemented --- errorlevel 1
В чем проблема? Стандарт вроде бы не нарушается. Если убрать ковариантность указателей или виртуальное наследование - все работает как надо.
Visual Studio «эффективна» как всегда - каких-то 4 часа, и мне удалось понять, что именно ей не нравится :(