►Когда фунция не являтся виртуальной...246

We use cookies. Read the Privacy and Cookie Policy

Даже если вы считаете, что некоторая функция вызывается с использованием позднего связывания, это отнюдь не означает, что так и есть на самом деле. Если она не объявлена с теми же аргументами в подклассах, то она не будет переопределяться, независимо от того, объявили ли вы её виртуальной или нет.

В правиле об идентичности объявления есть только одно исключение, которое состоит в том, что если функция-член базового класса возвращает указатель или ссылку на объект базового класса, то переопределяемая функция-член может возвращать указатель или ссылку на объект подкласса. Другими словами, приведённая ниже программа допустима.

    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. Наследование