Вход на сайт
как правильно программировать?
785 просмотров
Перейти к просмотру всей ветки
в ответ Murr 20.09.09 01:25, Последний раз изменено 20.09.09 08:57 (anly)
В ответ на:
...то 21й наследник будет использовать именно её...
------
21-й наследник будет использовать ту, которая определена правилами.
В случае Плюсов, дай бог памяти, это будет последняя из определенных в предках соответсвующих факическому типу объекта.
Учи матчасть.
Что и есть ошибка, которая может проявиться
------
Она "проявляется" при тестировании. По этому вопросу, опять таки - учи матчасть.
да вот мат часть кажись я получше знаю. ...то 21й наследник будет использовать именно её...
------
21-й наследник будет использовать ту, которая определена правилами.
В случае Плюсов, дай бог памяти, это будет последняя из определенных в предках соответсвующих факическому типу объекта.
Учи матчасть.
Что и есть ошибка, которая может проявиться
------
Она "проявляется" при тестировании. По этому вопросу, опять таки - учи матчасть.

Во-первых, везёт вам что занимаетесь такими программами, что есть возможность всё протестировать. Во вторых, даже тест не гарантирует отсутствие ошибок. Особенно, если тестирует не девелопер, а тестировщик, который исходники не видит, да и частенько языка не понимает. Но даже если девелопер тестирует, тоже гарантии нет. Ошибка может проявиться только после изменений, косвенно влияющих на данный код или зависящих от данного кода.
Во вторых пример.(только по существу вопроса, т.е. виртуальности. не обращайте внимание например на утечки памяти, не хочу отвлекать от сути).
У базового класса есть виртуальная функция, которая не пустая, а что-то делает. И некоторые наследники не переопределяют её. А некоторые наследники переопределяют.
class A
{
virtual void myfun(int n);
}
class B : A
{
}
class C : A
{
virtual void myfun(int n);
}
// ..... и еще 25 наследников ...
main()
{
A* p = new B;
p->myfun(76); // вызов A::myfun()
p = new C;
p->myfun(33); // вызов С::myfun()
}
Прошло сто лет и надо добавить параметр в функцию. Этот параметр обрабатывается только в функции одного из наследников (которого я здесь даже не показал), функция базового класса(А) новый параметр просто игнорирует, класса С - тоже.
class A
{
virtual void myfun(int n, bool b);
}
в A добавил, и во всех других наследниках, которые переопределяют эту функцию, кроме С. в C не добавил, не доглядел.
В main подправим, это даже компилятор потребует.
main()
{
A* p = new B;
p->myfun(76, false); // вызов A::myfun()
p = new C;
p->myfun(33, false); // вызов A::myfun() !!!!!!!!!!!!!!!!!!! ошибка !!!!!
}
Проклят нарушающий межи ближнего своего (Втор.27:17)