Чтение онлайн

на главную - закладки

Жанры

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

Рассмотрим пример:

class base {

 public:

 int a, b;

};

class derived: public base {

 public:

 int b, c;

};

void f

{

 derived d;

 d.a = 1;

 d.base::b = 2;

 d.b = 3;

 d.c = 4;

 base* bp = &d; //
стандартное преобразование derived* в base*

}

Здесь присваиваются значения четырем членам d, а bp настраивается на d.

Класс называется прямым базовым, если он находится в списке-базовых, и косвенным базовым, если сам не являясь прямым базовым, он служит базовым для одного из классов списка-базовых.

Отметим, что в обозначении имя-класса :: имя конструкция, имя может быть именем члена косвенного базового класса. Такое обозначение просто указывает класс, в котором следует начинать поиск этого имени.

Приведем пример:

class A { public: void f; }

class B: public A {};

class C: public B { public: void f; }

void C::f

{

 f; // вызов f из C

 A::f; // вызов f из A

 B::f; // вызов f из A

}

Здесь дважды вызывается A::f, поскольку это единственная функция f в классе B.

Инициализация объектов, представляющих базовые классы, задается в конструкторах, см. §R.12.6.2.

R.10.1 Множественные базовые классы

Класс может быть производным по отношению к любому числу базовых классов. Приведем пример:

class A {/*… */};

class B {/*… */};

class C {/*… */};

class D: public A, public B, public C {/*… */};

Использование более, чем одного прямого базового класса называется множественным наследованием.

Порядок наследования не важен, если не учитывать вопросов, связанных со стандартной инициализацией с помощью конструктора (§R.12.1), уничтожением (§R.12.4) и размещением в памяти ($$r.5.4, §R.9.2, §R.11.1). Порядок выделения памяти для базовых классов определяется реализацией.

Нельзя указывать класс в качестве прямого базового по отношению к производному классу более одного раза, но косвенным базовым классом он может быть неоднократно.

class B {/*… */};

class D: public B, public B {/*… */}; // недопустимо

class L {/*… */};

class A: public L {/*… */};

class B: public L {/*… */};

class C: public A, public B {/*… */}; // нормально

Здесь объект класса C будет иметь два вложенных объекта класса L.

К спецификации базового класса можно добавить служебное слово virtual. Отдельный объект

виртуального базового класса V разделяется между всеми базовыми классами, которые указали V при задании своих базовых классов. Приведем пример:

class V {/*… */};

class A: virtual public V {/*… */};

class B: virtual public V {/*… */};

class C: public A, public B {/*… */};

Здесь объект класса C будет иметь только один вложенный объект класса V.

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

class B {/*… */};

class X: virtual public B {/*… */};

class Y: virtual public B {/*… */};

class Z: public B {/*… */};

class AA: public X, public Y, public Z {/*… */};

Здесь объект класса AA будет иметь два вложенных объекта класса B: из класса Z и виртуальный, разделяемый между классами X и Y.

R.10.1.1 Неоднозначности

Доступ к базовому классу должен быть задан однозначно. Доступ к члену базового класса считается неоднозначным, если выражение, используемое для доступа, задает более одной функции, объекта, типа или элемента перечисления. Проверка на однозначность происходит до проверки возможности доступа (§R.11). Приведем пример:

class A {

public:

 int a;

 int (*b);

 int f;

 int f(int);

 int g;

};

class B {

 int a;

 int b;

public:

 int f;

 int g;

 int h;

 int h(int);

};

class C: public A, public B {};

void g(C* pc)

{

 pc-›a = 1; // ошибка: неоднозначность: A::a или B::a

 pc-›b; // ошибка: неоднозначность: A::b или B::b

 pc-›f; // ошибка: неоднозначность: A::f или B::f

 pc-›f(1); // ошибка: неоднозначность: A::f или B::f

 pc-›g; // ошибка: неоднозначность: A::g или B::g

 pc-›g = 1; // ошибка: неоднозначность: A::g или B::g

 pc-›h; // нормально

 pc-›h(1); // нормально

}

Если имя перегруженной функции установлено однозначно, то прежде проверки возможности доступа происходит еще и разрешение перегрузки. Неоднозначность можно устранить, уточняя используемое имя именем класса, например, так:

Поделиться:
Популярные книги

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Жребий некроманта 3

Решетов Евгений Валерьевич
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Жребий некроманта 3

Вы не прошли собеседование

Олешкевич Надежда
1. Укротить миллионера
Любовные романы:
короткие любовные романы
5.00
рейтинг книги
Вы не прошли собеседование

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Барон Дубов 4

Карелин Сергей Витальевич
4. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 4

Волхв пятого разряда

Дроздов Анатолий Федорович
2. Ледащий
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Волхв пятого разряда

S-T-I-K-S. Окаянный

Текшин Антон
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.38
рейтинг книги
S-T-I-K-S. Окаянный

Имперский Курьер

Бо Вова
1. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Имперский Курьер

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Я подарю тебе ребёнка

Малиновская Маша
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Я подарю тебе ребёнка

Его нежеланная истинная

Кушкина Милена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Его нежеланная истинная

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7