компилятор VC6 на следующий код Код (Text): class Base { protected: int a; public: virtual void SetA(int i); }; class Child1:public Base { public: void SetA(int i) { a = i+1;} }; class Child2:public Base { public: void SetA(int i) { a = i+2;} }; void Main() { Base *pBase[2]; pBase[0] = new Child1; pBase[1] = new Child2; } при линковке выдаёт ошибку: unresolved external symbol "public: virtual void __thiscall Base::SetA(int)" (?SetA@Base@@UAEXH@Z) Сдаётся мне, что проблемма с настройками линкера... в чем может быть дело?
Все верно, т.к. нет реализации метода SetA в базовом классе. Его нужно либо реализовать, либо сделать чистым виртуальным: 'public: virtual void SetA(int i) = 0;'. И кстати, Main надо с маленькой буквы -- main. rmn опередил .
прототипы виртуальной ф-ции и её переопределенных ф-ций в унаследованных классах должны совпадать, так? подзапамятовал я.
Не совсем. Типы возвращаемых значений перекрываемых функций могут быть ковариантны. Т.е. все-таки один-в-один совпадать не обязаны.
Чёт опять не получается. сейчас выдаёт: main.obj : error LNK2001: unresolved external symbol __purecall
Х.з. Я в студию поставил компилятор и линкер от DDK. Может из-за этого. Но тем не менее должно компилироваться.
Quark Код (Text): class Base { protected:int a; public:virtual void SetA(int i) = 0; }; class Child1 : public Base { public:void SetA(int i) { a = i+1; } }; class Child2 : public Base { public:void SetA(int i) { a = i+2; } }; int main() { Base *pBase[2]; pBase[0] = new Child1; pBase[1] = new Child2; return 0; }
Мне не нужен стартап, генерируемый студией. Вобщем разведка доложила, что нужен msvcrt.lib. С ним всё в порядке. Самое интересное - он нужен только для линковке. В импорте msvcrt.dll нету ))
Посмотри в исходниках crt - они, вроде как, идут в комплекте со студией. Если исходников нет, попробуй создать просто заглушку - пустую функцию. Насколько я понимаю, она таковой и является по умолчанию. А вообще - гугл рулит.