Войти
ПрограммированиеФорумОбщее

С++ баг!! стандартный или MS-specific ?

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 4 5 6 7 Следующая »
#0
21:54, 6 фев. 2010

не для кого не секрет, что при переопределении виртуальных методов в дочернем классе, их можно "перегружать" по возвращаемому значению. проще продемонстрировать:

struct Base
{
    virtual Base* copy() = 0;
};
struct Child
{
    virtual Child* copy() { return new Child(); }
};
вполне корретный код, вполне корретно работает...

а теперь пример посложнее - совместим этот очень удобный прием с виртуальным наследованием:

// ================ внешний интерфейс

struct IObject
{
  virtual IObject* create() = 0;
  virtual void test() = 0;
};

struct IObjectModel : virtual IObject
{
};

// ================ реализация

struct ObjectImp : virtual IObject
{
  virtual ObjectImp* create();
  virtual void test() {}
};

struct ObjectModelImp : IObjectModel, ObjectImp { };

// ----------- функция создания объекта

ObjectImp* ObjectImp::create()
{
  return new ObjectModelImp();
}

// ================ пробуем

int _tmain(int argc, _TCHAR* argv[])
{
  IObject* a = new ObjectModelImp();
  IObject* b = a->create();
  b->test(); ////// на этой строке мы улетаем кудато по адресу 0xFFFFFFF и пытаемся там выполнить недопустимую (ну надоже!) инструкцию 0xFFFFFFFF

  return 0;
}

если в методе ObjectImp* ObjectImp::create(), заменит выходное значение на IObject, то все работает замечательно.

естьли этот ньюанс в стандарте? или это просто баг от мелкомягких?


#1
21:59, 6 фев. 2010

Kloun
> или это просто баг от мелкомягких?
В GCC работает. Скорее всего кривые руки у MS.

#2
22:06, 6 фев. 2010

предупреждения же не просто так

#3
22:12, 6 фев. 2010

ashujon
> предупреждения же не просто так
А почему в GCC ни проблем, ни предупреждений нет?

#4
22:17, 6 фев. 2010

ashujon
> предупреждения не просто так же
у меня отключены. посмотрел и чесно говоря не понял о чем предупреждение - этоже не две разные функции с одним именем - это одна виртуальная. темболее что верхняя фукнция абстрактная вообще. не логичное предупреждение. и  вовсе о другом

что происходит на деле - я объясню, IObject* b = a->create(); предполагает, что ему возвращают ссылку на IObject,  а ObjectImp* ObjectImp::create() очевидно возвращает ссылку на ObjectImp. сслыки на IObject и ObjectImp спокойно свободно конвертировалисьбы в друг друга, еслибы не виртуальное наследование!


X512
> В GCC работает. Скорее всего кривые руки у MS.
спасбо за проверку.... вот так пруха - то в луабинде с луа баги нахожу, теперь в компиляторе от MS....

возмите меня теститровщиком за большую зарплату!!!

#5
22:18, 6 фев. 2010

Интересно былобы услышать что на других версиях MSVC (я проверял на 9ке)

#6
22:23, 6 фев. 2010

Kloun
> у меня отключены.

а вот это зря. level 4 - это конечно мазохизм. но 3 должен быть всегда :)

#7
22:50, 6 фев. 2010

innuendo
> а вот это зря. level 4 - это конечно мазохизм. но 3 должен быть всегда :)
попробую на досуге.... точнее не то чтобы отключены , я их просто не читаю . их там несколько тысяч в проекте =)) а в VS9 там можно прсото скрыть в окне с ошибками.
был у меня порыв, убрать все варнинги - пока из 18ти проектов почистил только один xDD - прямо глаз радуется во время компиляции =))

#8
11:37, 7 фев. 2010

Kloun
> их там несколько тысяч в проекте
В таких случаях говорят "вон из профессии!". Тебе хоть стыдно?

#9
11:56, 7 фев. 2010

San
> > их там несколько тысяч в проекте
> В таких случаях говорят "вон из профессии!". Тебе хоть стыдно?
Конечно стыдно!

дело в том, что когда я начинал проект, сам с++ знал довольно плохо (до этого дельфистом был)... и было это года 4, а то и больше, назад. да и вообще проект начинался на движке  Virtools, который после подключения к проекту, сразу выдает тонну варнингов =((. да и вообще проект без меня начинался, я позже подключился, и пережил всех программистов тутташних.

#10
12:20, 7 фев. 2010

Насчет ворнингов...

angelscriptd.lib(as_variablescope.obj) : warning LNK4099: PDB 'vc90.pdb' was not found with 'D:\work\angelscript\sdk\angelscript\lib\angelscriptd.lib' or at 'D:\work\2D\c0de_engine\Debug\vc90.pdb'; linking object as if no debug info

Никак не могу понять, что там в проекте angelscript переделать, чтобы этих ворнингов не было.

#11
12:24, 7 фев. 2010

А все. Надо было edit and continue.

#12
12:27, 7 фев. 2010

MarkoPolo
> А все. Надо было edit and continue.
дык  оноже по-умолчанию включено )

#13
12:33, 7 фев. 2010

Kloun
А в билде angelscript оно включено лишь /Zi, а не /ZI.

#14
14:24, 7 фев. 2010

Kloun
> virtual ObjectImp* create();

Вероятно дело в этом: http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.13

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.