Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 57стр.doc
Скачиваний:
56
Добавлен:
15.06.2014
Размер:
478 Кб
Скачать
☆

Вопрос 49. Ключевое слово explicit.

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

Вопрос 50. Ключевое слово mutable.

Если член класса объявлен со словом mutable, то он может быть переопределён. Это означает, что члены с ключ словом mutable константного объекта не являются константными и могут быть модифицированы.

// mutable.cpp

class X

{

public:

bool GetFlag() const

{

m_accessCount++;

return m_flag;

}

private:

bool m_flag;

mutable int m_accessCount;

};

int main()

{

}

Вопрос 51. Указатели на члены класса.

Доступ к члену объекта можно получить ч-з указатель на этот объект. В этом случае применяется оператор -> . Указатель на объект объявляется точно так же, как и указатель на переменную любого другого типа. Задается имя класса этого объекта, затем имя переменной со * перед ним. Для получения адреса объекта перед ним необходим оператор &. Как и для любого другого указателя, если вы ++ указатель на объект, он будет указывать на следующий объект того же типа.

// Указатели на объекты

class samp {

int a, b;

public:

samp(int n, int m) { a = n; b = m; }

int get_a() { return a; }

int get_b() { return b; } };

int main()

{ samp ob[4] = {

samp(1, 2),

samp(3, 4),

samp(5, 6),

samp(7, 8)

};

int i;

samp *p;

p = ob; // получение адреса начала массива

for(i=0; i<4; i++) {

cout << p->get_a() << ' ';

cout << p->get_b() << "\n";

p++; // переход к следующему объекту

}

cout << "\n";

return 0;

}

Вопрос 52. Множественное наследование. Виртуальные базовые классы.

Класс может порождаться более, чем от одного базового класса; такое порождение называется множественным наследованием. Множественное наследование означает, что производный класс наследует эл-ты нескольких базовых классов. Для этого используется список базовых классов, в к-ом каждый из базовых классов отделён от других запятой. Множ-ное наследование указывается двоеточием (:) после имени класса с последующим перечислением ч/з запятую базовых классов.

class X{};

class Y{};

class Z : public X, public Y{};

поскольку класс Z наследует оба класс X и Y, то он имеет доступ к публичным и защищённым членам обоих классов X и Y.

Конструкторы базовых классов вызываются слева направо; деструкторы – наоборот.

Существуют две специфические для множ-ного наследования проблемы:

** как разрешить конфликты имен м/у суперклассами

** что делать с повторным наследованием.

Для устранения конфликта разрешается добавить к именам префиксы, указывающие имена классов, откуда они пришли.

Виртуальные базовые классы.

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

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

Отличие м/у обычным и виртуальным наследованием:

  • когда класс наследует базовый класс более одного раза, то он будет содержать только одно вхождение базового класса.

Пример:

При виртуальном наследовании базовых классов в первую очередь вызываются конструкторы виртуальных базовых классов в порядке наследования (первым будет вызван конструктор виртуального класса А, затем конструктор виртуального класса С, затем конструктор базового класса B) и последним будет вызван конструктор производного класса. Деструкторы вызываются в обратном порядке.

В(базовый) -> A(наследуемый) -> C(наследуемый виртуально)