Re: нехорошая штука от С++. Вчера наткнулся
От: eaglus Россия  
Дата: 22.06.06 11:01
Оценка: 1 (1) +2
AR>Был базовый класс с виртуальным (не =0) методом float GetA().
AR>Ну и куча наследников от него, который этот метод перекрывали.
AR>Ну и решил я переименовать этот метод в bool IsA().
AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.
AR>И как-то мне это не понравилось...

На самом деле это кака.
Вот в C# или Delphi с этим сильно лучше — там метод просто так не перекроешь:
надо писать override, когда перекрываешь — и компилятор будет смотреть в базовый класс, и проверять — есть ли там такой метод.
Так что там бы ты обломался.
Вообще, с плюсах не лучшая модель ООП. Самая базовая, скажем так.
Re[4]: нехорошая штука от С++. Вчера наткнулся
От: Amon-RA  
Дата: 22.06.06 10:48
Оценка: :)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

Я все понимаю. И понимаю, что именно я сделал и что компилятор этого не может прочухать. Я просто поделился впечатлением

(Все производители компиляторов кинулись ломать головы, как бы такое провернуть )
нехорошая штука от С++. Вчера наткнулся
От: Amon-RA  
Дата: 22.06.06 10:29
Оценка:
Был базовый класс с виртуальным (не =0) методом float GetA().

Ну и куча наследников от него, который этот метод перекрывали.

Ну и решил я переименовать этот метод в bool IsA().

Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.

И как-то мне это не понравилось...
Re: нехорошая штука от С++. Вчера наткнулся
От: Sni4ok  
Дата: 22.06.06 10:38
Оценка:
AR>Ну и решил я переименовать этот метод в bool IsA().

AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.


AR>И как-то мне это не понравилось...


что именно не понравилось? что не было ошибок?
это же просто значит, что через базовый интерфейс этот метод не вызывался.
Re[2]: нехорошая штука от С++. Вчера наткнулся
От: Amon-RA  
Дата: 22.06.06 10:39
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>что именно не понравилось? что не было ошибок?

S>это же просто значит, что через базовый интерфейс этот метод не вызывался.

Я в курсах, что это значит.
Да, не понравилось, что не было ругани компилятора
Re[3]: нехорошая штука от С++. Вчера наткнулся
От: Lorenzo_LAMAS  
Дата: 22.06.06 10:44
Оценка:
AR>Я в курсах, что это значит.
AR>Да, не понравилось, что не было ругани компилятора

А какая она должна быть, ругань? Компилятор, используя свой зловещий мега-интеллект, должен понять, что ты сделал? Что IsA это то, что раньше было GetA?
Я еще понимаю, если б у тебя имя осталось прежним, но как-то все-же поменялась сигнатура — тогда да, тут было бы неплохо выдать ворнинг, что вместо замещения произошло скрытие — g++, допустим, может такое.
Of course, the code must be complete enough to compile and link.
Re[5]: нехорошая штука от С++. Вчера наткнулся
От: Lorenzo_LAMAS  
Дата: 22.06.06 10:52
Оценка:
AR>(Все производители компиляторов кинулись ломать головы, как бы такое провернуть )

Ага, и на форуме появилось новое сообщение от Amon-RA :

"Я решил убрать виртуальную функцию из базового класса, а в производных их оставил (там они без ключевого слова виртуал, но мне это подходило) — так компилятор задолбал ворнингами. Не нравится мне это!"

Of course, the code must be complete enough to compile and link.
Re[6]: нехорошая штука от С++. Вчера наткнулся
От: Amon-RA  
Дата: 22.06.06 10:54
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

Re[2]: нехорошая штука от С++. Вчера наткнулся
От: Amon-RA  
Дата: 22.06.06 11:03
Оценка:
Здравствуйте, eaglus, Вы писали:

E>На самом деле это кака.

E>Вот в C# или Delphi с этим сильно лучше — там метод просто так не перекроешь:
E>надо писать override, когда перекрываешь — и компилятор будет смотреть в базовый класс, и проверять — есть ли там такой метод.
E>Так что там бы ты обломался.

Да, хорошее решение проблемы
Re: нехорошая штука от С++. Вчера наткнулся
От: ArtDenis Россия  
Дата: 22.06.06 14:12
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR>Ну и решил я переименовать этот метод в bool IsA().


Для переименования ф-ций во всём дереве наследования надо пользоваться каким-нибудь средством рефакторинга. А так вообще, да, есть такая проблема в с++...
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: нехорошая штука от С++. Вчера наткнулся
От: zelyony  
Дата: 22.06.06 14:29
Оценка:
в ВС2005 в не МС++ (простой, но вне стандарта)
есть ключевое слово [override]
и оно работает как ты и хочешь
#include <iostream>
using namespace std;

struct A {
 virtual ~A() { }
 virtual void test() {
  cout << __FUNCTION__ << endl;
 }
};

struct B : A {
 void test() override {
  cout << __FUNCTION__ << endl;
 }
};

void main() {
 A* pa = new B();
 pa->test();
}

если переименуешь A::test => получишь
test.cpp(12) : error C3668: 'B::test' : method with override specifier 'override' did not override any base class methods
test.cpp(19) : error C2039: 'test' : is not a member of 'A'
test.cpp(4) : see declaration of 'A'

так же есть слова "abstract" и "sealed"
Posted via RSDN NNTP Server 2.0
Re: нехорошая штука от С++. Вчера наткнулся
От: Аноним  
Дата: 22.06.06 18:04
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR>Был базовый класс с виртуальным (не =0) методом float GetA().


AR>Ну и куча наследников от него, который этот метод перекрывали.


AR>Ну и решил я переименовать этот метод в bool IsA().


AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.


AR>И как-то мне это не понравилось...

то что вам нужно — называется рефакторинг, есть какие-то зачатки этой штуки в CDT плагине для Eclipse,
но плагин не так силен в этом деле

чтобы компилятор поддерживал рефакторинг — я даже не представляю как это может выглядеть — фантазии не хватает
Re: нехорошая штука от С++. Вчера наткнулся
От: Шахтер Интернет  
Дата: 22.06.06 20:12
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR>Был базовый класс с виртуальным (не =0) методом float GetA().


AR>Ну и куча наследников от него, который этот метод перекрывали.


AR>Ну и решил я переименовать этот метод в bool IsA().


AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.


AR>И как-то мне это не понравилось...


Сделай его чистым. После того как исправишь всех наследников сделаешь опять нечистым.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Уже не раз обсуждали проблему
От: remark Россия http://www.1024cores.net/
Дата: 22.06.06 20:50
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR>Был базовый класс с виртуальным (не =0) методом float GetA().


AR>Ну и куча наследников от него, который этот метод перекрывали.


AR>Ну и решил я переименовать этот метод в bool IsA().


AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.


AR>И как-то мне это не понравилось...



здесь
Автор: remark
Дата: 08.12.05
обсуждали и я приводил решение как можно от этого уберечься в рамках чистого с++. Там наследник фиксирует сигнатуру, которую он перекрывает. И если она изменяется, то наследник ломается.

здесь
Автор: achp
Дата: 08.09.04
тоже немного обсуждали.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Уже не раз обсуждали проблему
От: Константин Л.  
Дата: 23.06.06 11:35
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Amon-RA, Вы писали:


AR>>Был базовый класс с виртуальным (не =0) методом float GetA().


AR>>Ну и куча наследников от него, который этот метод перекрывали.


AR>>Ну и решил я переименовать этот метод в bool IsA().


AR>>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.


AR>>И как-то мне это не понравилось...



R>здесь
Автор: remark
Дата: 08.12.05
обсуждали и я приводил решение как можно от этого уберечься в рамках чистого с++. Там наследник фиксирует сигнатуру, которую он перекрывает. И если она изменяется, то наследник ломается.


R>здесь
Автор: achp
Дата: 08.09.04
тоже немного обсуждали.



R>


Не стал читать, но это можно победить добавив root


class Root
{
public:

   virtual void f()= 0;
   virtual ~Root(){}
};

class Base : public Root
{
public:

   virtual void f(){}
};


при изменении Root будут эрроры на всех наследников Base и самого Base. Сначала фиксишь наследников, потом Base
Re: нехорошая штука от С++. Вчера наткнулся
От: gear nuke  
Дата: 23.06.06 13:56
Оценка:
Здравствуйте, Amon-RA, Вы писали:

[]

Было уже
Автор: Павел Кузнецов
Дата: 09.12.05

(почему-то сайт не работает нашел "Diagnosing misoverriding functions in C++" в кеше гугла)
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.