17.4.1. Конструктор базового класса

17.4.1. Конструктор базового класса

В нашем базовом классе объявлено два нестатических члена: _solution и _loc:

class Query {

public:

// ...

protected:

setshort *_solution;

vectorlocation _loc;

// ...

};

Конструктор Query по умолчанию должен явно инициализировать только член _solution. Для инициализации _loc автоматически вызывается конструктор класса vector. Вот реализация нашего конструктора:

inline Query::Query(): _solution( 0 ) {}

В Query нам понадобится еще один конструктор, принимающий ссылку на вектор позиций:

inline

Query::

Query( const vector locaton &loc )

: _solution( 0 ), _loc( loc )

{}

Он вызывается только из конструктора NameQuery, когда объект этого класса используется для представления указанного в запросе слова. В таком случае передается предварительно подготовленный для него вектор позиций. Остальные три производных класса вычисляют свои векторы позиций в соответствующей функции-члене eval(). (В следующем подразделе мы покажем, как это делается. Реализации функций-членов eval() приведены в разделе 17.5.)

Какой уровень доступа обеспечить для конструкторов? Мы не хотим объявлять их открытыми, так как предполагается, что Query будет существовать в программе только в виде подобъекта в составе объектов производных от него классов. Поэтому мы объявим конструктор не открытым, а защищенным:

class Query {

public:

// ...

protected:

Query();

// ...

};

Ко второму конструктору класса Query предъявляются еще более жесткие требования: он не только должен конструировать Query в виде подобъекта производного класса, но этот производный класс должен к тому же быть NameQuery. Можно объявить конструктор закрытым, а NameQuery сделать другом класса Query. (В предыдущем разделе мы говорили, что производный класс может получить доступ только к открытым и защищенным членам базового. Поэтому любая попытка вызвать второй конструктор из классов AndQuery, OrQuery или NotQuery приведет к ошибке компиляции.)

class Query {

public:

// ...

protected:

Query();

// ...

private:

explicit Query( const vectorlocation& );

};

(Необходимость второго конструктора спорна; вероятно, правильнее заполнить _loc в функции eval() класса NameQuery. Однако принятый подход в большей степени отвечает нашей цели проиллюстрировать использование конструктора базового класса.)

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

R.18.3.2 Старый стиль задания инициализатора базового класса

Из книги Справочное руководство по C++ автора Страустрап Бьярн

R.18.3.2 Старый стиль задания инициализатора базового класса В конструкции инициализатор-памяти (§R.12.6.2) можно не указывать имя-класса, обозначающее базовый класс при условии, что существует только один прямой (непосредственный) базовый класс. Поэтому в описанииclass B


Роль базового класса WebService

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Роль базового класса WebService В процессе разработки сервиса HelloWorldWebService вы имели возможность убедиться том, что Web-сервис можно получить непосредственно из System.Object. Но по умолчанию Web-сервисы, созданные в Visual Studio 2005, автоматически получаются из базового класса


Разграничение доступа к элементам базового класса

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

Разграничение доступа к элементам базового класса Мы уже рассказывали, что можно управлять доступом к элементам класса, указывая спецификаторы доступа для элементов класса. Элементы класса, объявленные с спецификаторами protected и private доступны только из методов самого


Переопределение методов базового класса

Из книги C++. Сборник рецептов автора Диггинс Кристофер

Переопределение методов базового класса В порожденном классе можно определить методы и элементы данных с именами, которые уже используются в базовом классе. Соответствующие методы и элементы данных базового класса оказываются скрыты. Чтобы обратиться к ним, необходимо


Классы, не имеющие базового класса

Из книги Как сделать свой сайт и заработать на нем. Практическое пособие для начинающих по заработку в Интернете автора Мухутдинов Евгений

Классы, не имеющие базового класса Кроме классов, наследованных от базового класса CObject, библиотека MFC включает ряд самостоятельных классов. У них нет общего базового класса и они имеют различное назначение.Несколько классов, которые не наследуются от базового класса


Конструктор класса

Из книги Информационные технологии в СССР. Создатели советской вычислительной техники автора Ревич Юрий Всеволодович

Конструктор класса Класс CString имеет несколько различных конструкторов, позволяющих создавать строки на основе различных данных.Конструктор класса CString, используемый по умолчанию, не имеет параметров. Он создает пустую строку. В последствии вы можете записать в нее любой


8.10. Создание интерфейса с помощью абстрактного базового класса

Из книги C++ для начинающих автора Липпман Стенли

8.10. Создание интерфейса с помощью абстрактного базового класса ПроблемаТребуется определить интерфейс, который будет реализовываться производными классами, но концепция этого интерфейса является абстракцией и не должна наследоваться сама по себе.РешениеСоздайте


Конструктор ЭВМ

Из книги автора

Конструктор ЭВМ Будучи руководителем Вычислительного центра АН УССР, а затем директором Института кибернетики, костяком которых стал коллектив, работавший над первыми отечественными ЭВМ, В. М. Глушков просто не мог не втянуться в область создания средств вычислительной


14.2. Конструктор класса

Из книги автора

14.2. Конструктор класса Среди других функций-членов конструктор выделяется тем, что его имя совпадает с именем класса. Для объявления конструктора по умолчанию мы пишем2:class Account {public:// конструктор по умолчанию ...Account();// ...private:char *_name;unsigned int _acct_nmbr;double _balance;};Единственное


17.2.1. Определение базового класса

Из книги автора

17.2.1. Определение базового класса * Члены Query представляют: множество операций, поддерживаемых всеми производными от него классами запросов. Сюда входят как виртуальные операции, переопределяемые в производных классах, так и невиртуальные, разделяемые всеми производными


17.3. Доступ к членам базового класса

Из книги автора

17.3. Доступ к членам базового класса Объект производного класса фактически построен из нескольких частей. Каждый базовый класс вносит свою долю в виде подобъекта, составленного из нестатических данных-членов этого класса. Объект производного класса построен из


17.4. Конструирование базового и производного классов

Из книги автора

17.4. Конструирование базового и производного классов Напомним, что объект производного класса состоит из одного или более подобъектов, соответствующих базовым классам, и части, относящейся к самому производному. Например, NameQuery состоит из подобъекта Query и объекта-члена


17.4.2. Конструктор производного класса

Из книги автора

17.4.2. Конструктор производного класса В классе NameQuery также определены два конструктора. Они объявлены открытыми, поскольку ожидается, что в приложении будут создаваться объекты этого класса:class NameQuery : public Query {public:explicit NameQuery( const string& );NameQuery( const string&, const vector* );// ...protected://


18.5.1. Объявление виртуального базового класса

Из книги автора

18.5.1. Объявление виртуального базового класса Для указания виртуального наследования в объявление базового класса вставляется модификатор virtual. Так, в данном примере ZooAnimal становится виртуальным базовым для Bear и Raccoon:// взаимное расположение ключевых слов public и virtual//


18.5.4. Видимость членов виртуального базового класса

Из книги автора

18.5.4. Видимость членов виртуального базового класса Изменим наш класс Bear так, чтобы он имел собственную реализацию функции-члена onExhibit(), предоставляемой также ZooAnimal: bool Bear::onExhibit() { ... }Теперь обращение к onExhibit() через объект Bear разрешается в пользу экземпляра, определенного в