LINUX.ORG.RU

[C++] Ковариантность и виртуальное наследование

 


0

0

Пытаюсь скомпилировать примерно такой код:

#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 часа, и мне удалось понять, что именно ей не нравится :(

anonymous

Юзай gcc4.

anonymous
()

gcc version 4.3.2 20081105 (Red Hat 4.3.2-7) (GCC)

Нормально съел.

mv ★★★★★
()

3.4.3 и 4.3.1 тоже компилируют,
Правда 3.4.3 вариант грохнулся при запуске при попытке обратного
преобразования NULL адреса. 4.3.1 вообще сработал нормально.

io ★★
()

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

svu ★★★★★
()
Ответ на: комментарий от svu

>Занятно, теперь в плюсах можно определять методы, отличающиеся только возвращаемым значением?...

Можно только двигаться в сторону сужения. Если виртуальный метод возвращает Base*, то в перегруженном виртуальном методе можно только сузить тип, возвращая одного из наследников Base*. Выглядит довольно невинно.

Absurd ★★★
()

>Стандарт вроде бы не нарушается.

Т.н. Стандарт С++ - вещь не имеющая отношения к реальности. Только наиболее топорный С++ - код в стиле начала 90-х наподобие MFC хоть как-то компилируется и хоть как-то работает.

Absurd ★★★
()

Ох уж эта ковариантность...

mint
()
Ответ на: комментарий от svu

> Занятно, теперь в плюсах можно определять методы, отличающиеся только возвращаемым значением?..

так это всегда можно было, еще со времен лохматого страуструпа.

В данном случае специфические проблемы со множественным наследованием.

dilmah ★★★★★
()
Ответ на: комментарий от Absurd

> Т.н. Стандарт С++ - вещь не имеющая отношения к реальности. Только наиболее топорный С++ - код в стиле начала 90-х наподобие MFC хоть как-то компилируется и хоть как-то работает.

Разве MFC - это C++? Там же куча макросов, M$-фич и постоянно приходится вызывать WinAPI напрямую.

И не все так печально. Лет 8 назад я бы и сам так сказал. Сейчас, если поддерживать один более-менее новый компилятор, большинством фич стандарта можно пользоваться. Но не всегда нужно :)

Странно, что сразу три компилятора не переварили этот код.

С вижуалом все ясно - унылое энтерпрайзное глюкалово. Если б не студия с мышевозными "мастерами" и "плугинами" для кодирующих обезьянок, компилятор сдох бы уже.

Но почему остальные не осилили? Может множественное наследование никто больше не использует? :)

anonymous
()
Ответ на: комментарий от anonymous

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

Качество кодогенерации у него получше чем у гыцацы. А перформанс раза в два выше чем у интеля, что для плюсов мягко скажем важно.

Absurd ★★★
()
Ответ на: комментарий от Absurd

> А перформанс раза в два выше чем у интеля

При компиляции выбегают девочки чарлидеры с бубенчиками и поддерживают морально уставшего кодера своими возбуждающими танцами ?

phasma ★☆
()
Ответ на: комментарий от Absurd

> Качество кодогенерации у него получше чем у гыцацы. А перформанс раза в два выше чем у интеля, что для плюсов мягко скажем важно.

Качество генерации только для релизных билдов важно, и то не всегда. Да и последние гцц продвинулись в этом плане, а MSVC гниет уже - мелкомяхкие двигают С#. Когда-нибудь гцц догонит, если уже не догнал.

Перформанц - это уж как проект написан. Некоторые как напишут - сотня длл по 100кб каждая - "компоненты" (на каждую предкомпилированный заголовок мегабайт 15 - "чтоб быстрее собиралось"), везде буст, стл, CORBA и еще куча либ, и их заголовки на сетевом диске на сервере, на котором крутится почта, вебсервер, прокся и т.д. Еще и #include'ят половину всех заголовков в каждый файл. Тут и вижуальный компилятор раком встанет. Костыли вроде IncrediBuild не от хорошей жизни делали. Толку от него мало, правда, думать все равно приходится...

Используют-то именно его из-за "мастеров" студии, а не качества кода. Поэтому и избавиться от него почти невозможно - люди без студии работать не могут :(

anonymous
()
Ответ на: комментарий от anonymous

>Используют-то именно его из-за "мастеров" студии, а не качества кода.

Забыл про Platform SDK/Driver SDK и прочие полезные вещи не от фанатов Дельфи, а от первоисточника.

Absurd ★★★
()
Ответ на: комментарий от Absurd

> Забыл про Platform SDK/Driver SDK и прочие полезные вещи не от фанатов Дельфи, а от первоисточника.

Их и без студии можно использовать. Разве что заголовки иногда надо поправить.

И другие инструменты часто лучше, тот же SoftICE, например.

anonymous
()

andrey@evilhorse ~ $ g++ dummy.cpp && ./a.out
LEFT DERIVED
andrey@evilhorse ~ $ g++ --version
g++ (GCC) 4.1.2 (Gentoo 4.1.2 p1.1)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

andrey@evilhorse ~ $ 

generatorglukoff ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.