C ++: родительский объект, вызывающий функцию от потомка, которая не была объявлена ​​сама по себе.Как? - PullRequest
0 голосов
/ 21 ноября 2018

Следующий код компилируется и работает правильно, и он был взят с веб-сайта о шаблонах проектирования c ++.То, что я не понимаю, как это вообще компилируется.Проблемы:

1) Как говорится в заголовке, родитель вызывает функцию с именем CreateDocument, которой нет в ее объявлении в функции NewDocument (char * name).Функция с тем же именем, но разными параметрами объявлена ​​как чисто виртуальная.

2) Мне также не удается увидеть, как работает метод «NewDocument (char * name)», поскольку он не имеет возвращаемого типа.Это не конструктор базового класса.

Фрагмент кода приведен ниже.Полный код можно найти по ссылке, указанной выше.

    class Application
    {
      public:
        Application(): _index(0)
        {
            cout << "Application: ctor" << endl;
        }
        /* The client will call this "entry point" of the framework */
        NewDocument(char *name)
        {
            cout << "Application: NewDocument()" << endl;
            /* Framework calls the "hole" reserved for client customization              */
            _docs[_index] = CreateDocument(name);
            _docs[_index++]->Open();
        }
        void OpenDocument(){}
        void ReportDocs();
        /* Framework declares a "hole" for the client to customize */
        virtual Document *CreateDocument(char*) = 0;
      private:
        int _index;
        /* Framework uses Document's base class */
        Document *_docs[10];
    };

    void Application::ReportDocs()
    {
      cout << "Application: ReportDocs()" << endl;
      for (int i = 0; i < _index; i++)
        cout << "   " << _docs[i]->GetName() << endl;
    }


    /* Customization of framework defined by client */
    class MyApplication: public Application
    {
      public:
        MyApplication()
        {
            cout << "MyApplication: ctor" << endl;
        }
        /* Client defines Framework's "hole" */
        Document *CreateDocument(char *fn)
        {
            cout << "   MyApplication: CreateDocument()" << endl;
            return new MyDocument(fn);
        }
    };

1 Ответ

0 голосов
/ 21 ноября 2018

1) NewDocument вызывает чисто виртуальный метод CreateDocument.Этот метод объявлен как , принимает char* и возвращает Document*.MyApplication также объявляет и реализует CreateDocument, который принимает char* и возвращает Document*.Другими словами, они имеют одинаковую подпись.Фактические имена параметров не участвуют в этом разрешении и для этой цели игнорируются.

2) Метод Application::NewDocument(char *name) просто слишком устарел, предшествующий первому стандарту C ++.Он должен быть объявлен как void NewDocument(char *name) для работы.

Как уже упоминалось в комментариях, существует множество других проблем с кодом, например, отсутствует отсутствующий деструктор ~Application(), необходимый для удаленияутечка памяти.~Application() { while (_index-- > 0) delete _docs[_index]; }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...