►Когда фунция не являтся виртуальной...246
Даже если вы считаете, что некоторая функция вызывается с использованием позднего связывания, это отнюдь не означает, что так и есть на самом деле. Если она не объявлена с теми же аргументами в подклассах, то она не будет переопределяться, независимо от того, объявили ли вы её виртуальной или нет.
В правиле об идентичности объявления есть только одно исключение, которое состоит в том, что если функция-член базового класса возвращает указатель или ссылку на объект базового класса, то переопределяемая функция-член может возвращать указатель или ссылку на объект подкласса. Другими словами, приведённая ниже программа допустима.
class Base
{
public :
/* Возвращает копию текущего объекта */
Base* makeACopy( )
{
/* ...делает всё, что нужно для создания копии */
}
} ;
class Subclass : public Base
{
public :
/* Возвращает копию текущего объекта */
Subclass* makeACopy( )
{
/* ...Делает всё, что нужно для создания копии */
}
} ;
void fn( BaseClass& bс )
{
BaseClass* pCopy = bс.makeACopy( ) ;
/* Функция продолжается... */
}
С практической точки зрения всё естественно: функция копирования makeCopy( ) должна возвращать указатель на объект типа Subclass, даже если она переопределяет Base::makeCopy( ).
_________________
246 стр. Часть 4. Наследование
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ