Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC++(теория).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
375.3 Кб
Скачать

Множественное наследование

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

class CollectionOfBook : public Book, public Collection {

// Дополнительные данные

};

  • Если класс наследуется не виртуальным способом, то все данные хранятся вместе, в частности переменная а класса С хранится в двух экземплярах, обращение к нужному идентификатору - через оператор разрешения видимости :: (\33MULTII)

class A { // Первый базовый класс

public:

int a; // Данное

int b() { return(a); } // и две функции

char c() { return('C'); }

};

class B { //Второй базовый класс

public:

int a; // Данное с тем же именем, что у класса A

int b() { return(c);} // Функция с тем же именем, что у класса A

char c; // Данное с тем же именем, что функция класса A

};

class C : public A, public B { // Базовый класс С производный от классов A и B

};

int main()

{

C *pc = new C; // Динамическое создание переменной класса C

// cout << pc->a << endl; // Неверный доступ к данному a

cout << "\n A::a : " << pc->A::a; // Доступ к данному через уточнение видимости

cout << "\n B::a : " << pc->B::a;

pc->A::a = 123456; // Изменение данного a базового класса A

cout << "\n A::a : " << pc->A::a;

cout << "\n B::a : " << pc->B::a;

// cout << pc->b() << endl; // Неверный доступ к функции

cout << pc->A::b() << endl; // Тоже нужна операция уточнения видимости

// cout << "\n C() : " << pc->c(); // Неверный доступ к функции класса A

// cout << "\n C : " << pc->c; // Неверный доступ к данному класса B

cout << "\n A::C() : " << pc->A::c(); // Опять же через уточнение видимости

cout << "\n B::C : " << pc->B::c;

return(0);

}

  • При виртуальном множественном наследовании в производном классе хранится только одна копия данных базового класса, и доминирует та переменная или метод, класс которого первым объявлен (\34VIRTMI)

class A { // Базовый класс

public:

int a;

};

class B : public virtual A { // Виртуальное наследование

};

class C : public virtual A { // Виртуальное наследование

};

class D : public C, public B { // Класс хранит только одну копию a

};

int main()

{

D d; // Создание объекта класса D

cout << d.B::a << endl; // Текущее содержание данного

cout << d.C::a << endl;

d.a = 1; // Изменение данного

cout << d.B::a << endl; // Данное храниться в одном экземпляре

cout << d.C::a << endl; // Поэтому уточнение видимости не обязательно

return(0);

}

Дополнительно: Объектно-ориентированный список в С++ (\35NNR)

  • Пример показывает использование инкапсуляции, наследования, полиморфизма (виртуальные функции), дружественных классов, принципы работы с разнородными объектами и построение связанных списков.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]