AR>Был базовый класс с виртуальным (не =0) методом float GetA(). AR>Ну и куча наследников от него, который этот метод перекрывали. AR>Ну и решил я переименовать этот метод в bool IsA(). AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было. AR>И как-то мне это не понравилось...
На самом деле это кака.
Вот в C# или Delphi с этим сильно лучше — там метод просто так не перекроешь:
надо писать override, когда перекрываешь — и компилятор будет смотреть в базовый класс, и проверять — есть ли там такой метод.
Так что там бы ты обломался.
Вообще, с плюсах не лучшая модель ООП. Самая базовая, скажем так.
AR>Ну и решил я переименовать этот метод в bool IsA().
AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.
AR>И как-то мне это не понравилось...
что именно не понравилось? что не было ошибок?
это же просто значит, что через базовый интерфейс этот метод не вызывался.
Здравствуйте, Sni4ok, Вы писали:
S>что именно не понравилось? что не было ошибок? S>это же просто значит, что через базовый интерфейс этот метод не вызывался.
Я в курсах, что это значит.
Да, не понравилось, что не было ругани компилятора
AR>Я в курсах, что это значит. AR>Да, не понравилось, что не было ругани компилятора
А какая она должна быть, ругань? Компилятор, используя свой зловещий мега-интеллект, должен понять, что ты сделал? Что IsA это то, что раньше было GetA?
Я еще понимаю, если б у тебя имя осталось прежним, но как-то все-же поменялась сигнатура — тогда да, тут было бы неплохо выдать ворнинг, что вместо замещения произошло скрытие — g++, допустим, может такое.
Of course, the code must be complete enough to compile and link.
AR>(Все производители компиляторов кинулись ломать головы, как бы такое провернуть )
Ага, и на форуме появилось новое сообщение от Amon-RA :
"Я решил убрать виртуальную функцию из базового класса, а в производных их оставил (там они без ключевого слова виртуал, но мне это подходило) — так компилятор задолбал ворнингами. Не нравится мне это!"
Of course, the code must be complete enough to compile and link.
Здравствуйте, eaglus, Вы писали:
E>На самом деле это кака. E>Вот в C# или Delphi с этим сильно лучше — там метод просто так не перекроешь: E>надо писать override, когда перекрываешь — и компилятор будет смотреть в базовый класс, и проверять — есть ли там такой метод. E>Так что там бы ты обломался.
Здравствуйте, Amon-RA, Вы писали:
AR>Ну и решил я переименовать этот метод в bool IsA().
Для переименования ф-ций во всём дереве наследования надо пользоваться каким-нибудь средством рефакторинга. А так вообще, да, есть такая проблема в с++...
в ВС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,
но плагин не так силен в этом деле
чтобы компилятор поддерживал рефакторинг — я даже не представляю как это может выглядеть — фантазии не хватает
Здравствуйте, Amon-RA, Вы писали:
AR>Был базовый класс с виртуальным (не =0) методом float GetA().
AR>Ну и куча наследников от него, который этот метод перекрывали.
AR>Ну и решил я переименовать этот метод в bool IsA().
AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.
AR>И как-то мне это не понравилось...
Сделай его чистым. После того как исправишь всех наследников сделаешь опять нечистым.
Здравствуйте, Amon-RA, Вы писали:
AR>Был базовый класс с виртуальным (не =0) методом float GetA().
AR>Ну и куча наследников от него, который этот метод перекрывали.
AR>Ну и решил я переименовать этот метод в bool IsA().
AR>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.
AR>И как-то мне это не понравилось...
обсуждали и я приводил решение как можно от этого уберечься в рамках чистого с++. Там наследник фиксирует сигнатуру, которую он перекрывает. И если она изменяется, то наследник ломается.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, Amon-RA, Вы писали:
AR>>Был базовый класс с виртуальным (не =0) методом float GetA().
AR>>Ну и куча наследников от него, который этот метод перекрывали.
AR>>Ну и решил я переименовать этот метод в bool IsA().
AR>>Ну, думаю, сейчас вылезет куча ошибок. Ну, если подумать, ясно, что никаких ошибок не было.
AR>>И как-то мне это не понравилось...
обсуждали и я приводил решение как можно от этого уберечься в рамках чистого с++. Там наследник фиксирует сигнатуру, которую он перекрывает. И если она изменяется, то наследник ломается.
R>здесь
(почему-то сайт не работает нашел "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