Следующий код компилируется и работает правильно, и он был взят с веб-сайта о шаблонах проектирования 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);
}
};