Программирование >>  Инициализация объектов класса, структура 

1 ... 319 320 321 [ 322 ] 323 324 325 ... 395


class Base { public:

bar( int ); ...

protected: int ival;

...

class Derivedl : virtual public Base {

public:

bar( char );

foo( char ); ...

protected: char cval;

...

class Derived2 : virtual public Base { public:

foo( int ); ...

protected: int ival; char cval;

...

class VMI : public Derivedl, public Derived2 {};

К каким из унаследованных членов можно обращаться из класса VMI, не квалифицируя имя? А какие требуют квалификации?

Упражнение 18.15

class Base { public:

Base();

Base( string ); Base( const Base& );

...

protected:

string name;

Дан класс Base с тремя конструкторами:

(a) бой из class Derivedl : virtual public Vase { ... }; class Derived2 : virtual public Vase { ... };

(b) class VMI : public Derivedl, public Derived2 { ... };

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

(c) class Final : public VMI { ... };



class Base {}; template <class Type>

Разрешается также произвести его от не шаблонного базового класса:

class Derived : public Base {};

template <class Type>

Шаблон может выступать одновременно в роли базового и производного классов:

class Array RC : public virtual AArray<Type> {};

В первом примере конкретизированный типом int шаблон Array служит закрытым базовым классом для не шаблонного IntStack. Во втором примере не шаблонн1й Base служит базовым для любого класса, конкретизированного из шаблона Derived. В третьем примере любой конкретизированный из шаблона Array RC класс является производным от класса, конкретизированного из шаблона Array. Так, инструкция

AArray RC<int> ia; конкретизирует экземпляры шаблонов Array и Array RC.

template < typename Type >

Кроме того, сам параметр-шаблон может служить базовым классом [MURRAY93]:

class Persistent : public Type { ... };

в данном примере определяется производный устойчивый (persistent) подтип для любого конкретизированного типа. Как отмечает Мюррей (Murray), на Type налагается неявное ограничение: он должен быть типом класса. Например, инструкция

Persistent< int > pi; ошибка

18.6. Пример множественного виртуального наследования A

Мы продемонстрируем определение и использование множественного виртуального наследования, реализовав иерархию шаблонов классов Array (см. раздел 2.4) на основе шаблона Array (см. главу 16), модифицированного так, чтобы он стал конкретным базовым классом. Перед тем как приступать к реализации, поговорим о взаимосвязях между шаблонами классов и наследованием.

Конкретизированный экземпляр такого шаблона может выступать в роли явного базового класса:

class IntStack : private Array<int> {};



template < class Type >

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

class Derived : public Base<Type> {};

ошибка: Base - это шаблон,

так что докн! быть задана! его аргументы template < class Type >

Такая запись неправильна:

class Derived : public Base {};

В следующем разделе шаблон Array, определенный в главе 16, выступает в роли виртуального базового класса для подтипа Array, контролирующего выход за границы массива; для отсортированного подтипа Array, для подтипа Array, который обладает обоими указанными свойствами. Однако первоначальное определение шаблона класса Array для наследования не подходит:

все его члены и вспомогательные функции объявлены закрыт1ми, а не защищенными;

ни одна из зависящих от типа функций-членов, скажем оператор взятия индекса, не объявлена виртуальной.

Означает ли это, что наша первоначальная реализация была неправильной? Нет. Она была верной на том уровне понимания, которым mi тогда обладали. При реализации шаблона класса Array мы еще не осознали необходимость специализированных подтипов. Теперь, однако, определение шаблона придется изменить так (реализации функций-членов при этом останутся теми же):

приводит к ошибке компиляции, поскольку встроенный тип не может быть объектом наследования.

Шаблон, выступающий в роли базового класса, должен квалифицироваться полным списком параметров. Если имеется определение:

template <class T> class Base {};



1 ... 319 320 321 [ 322 ] 323 324 325 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика