С++ для начинающих



         

Доступ к членам базового класса - часть 6


В базовом классе Query определен статический член _text_file:

static vector<string> *_text_file;

Создается ли при порождении класса NameQuery второй экземпляр _text_file, уникальный именно для него? Нет. Все объекты производного класса ссылаются на тот же самый, единственный разделяемый статический член. Сколько бы ни было производных классов, существует лишь один экземпляр _text_file. Можно обратиться к нему через объект производного класса с помощью синтаксиса доступа:

nameQueryObject._text_file;   // правильно

Наконец, если производный класс хочет получить доступ к закрытым членам своего базового класса напрямую, то он должен быть объявлен другом базового:

class Query {

   friend class NameQuery;

public:

   // ...

};

Теперь объект NameQuery может обращаться не только к закрытым членам своего подобъекта, соответствующего базовому классу, но и к закрытым и защищенным членам любых объектов Query.

А если мы произведем от NameQuery класс StringQuery? Он будет поддерживать сокращенную форму запроса AndQuery, и вместо

beautiful && fiery && bird

можно будет написать:

"beautiful fiery bird"

Унаследует ли StringQuery от класса NameQuery дружественные отношения с Query? Нет. Отношение дружественности не наследуется. Производный класс не становится другом класса, который объявил своим другом один из базовых. Если производному классу требуется стать другом одного или более классов, то эти классы должны предоставить ему соответствующие права явно. Например, у класса StringQuery нет никаких специальных прав доступа по отношению к Query. Если расширенный доступ необходим, то Query должен разрешить его явно.

Упражнение 17.6

Даны следующие определения базового и производных классов:

class Base {

public:

   foo( int );

   // ...

protected:

   int _bar;

   double _foo_bar;

};

class Derived : public Base {

public:

   foo( string );

   bool bar( Base *pb );

   void foobar();

   // ...

protected:

   string _bar;

};

Исправьте ошибки в каждом из следующих фрагментов кода:

Derived d; d.foo( 1024 );

 (b) void Derived::foobar() { _bar = 1024; }

(c) bool Derived::bar( Base *pb )

         { return _foo_bar == pb->_foo_bar; }




Содержание  Назад  Вперед