Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

До сих пор в этой главе производные и базовые классы были связаны отношением простого наследования.

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

 

 
 

 


 

       
   
 
 

 

 


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

Подключение базовых классов

Для вывода нового класса из нескольких базовых следует перечислить имена базовых классов после имени нового. Если А,В и С – классы, то новый класс D может наследовать их все следующим образом:

class D: public A, public B, public C {

……

};

Можно объявить несколько базовых классов закрытыми или защищенными в производном классе. Или же можно использовать спецификаторы доступа вперемежку:

class D: public A, public B, C {

….

};

Базовый класс С по умолчанию закрыт, но для ясности статус базового класса лучше задавать явным образом, будь он закрытым, защищенным или открытым. Эти же правила, изложенные ранее для простого наследования, действуют и в случае множественного наследования базовых классов.

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

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

Например, предположим, что классы А и В оба имеют открытую функцию-член Display(). В производном классе

class D: public A, public B {

public:

void f(void);

……

};

в функции-члене f() необходимо указать, какую из конфликтующих функций

Display() следует вызвать. Нужного эффекта можно добиться, задав имя соответствующего класса и оператора разрешения области видимости перед вызовом функции:

void D::f(void)

{

Display();

//??? Двусмысленно; не скомпилируется

A::Display();

// Вызов функции-члена А

B::Display();

//Вызов функции-члена В

}

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

В классе, выведенном из нескольких базовых, также может возникнуть необходимость в вызове конструкторов этих классов. Если классы А, В и С имеют конструкторы по умолчанию, в производном классе D их можно вызвать следующим образом:

class D: public A, public B, public C {

public:

D(): A(), B(), C() {}

// Встраиваемый конструктор

….

};

Или же конструктор можно объявить как

class D: public A, public B, public C {

public:

D();

// конструктор, реализованный снаружи

……

};

и реализовать отдельно, обычно, в другом файле:

D:D()

: A(), B(), C()

{

….. // операторы в конструкторе D()

}

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

<== предыдущая лекция | следующая лекция ==>
Виртуальные деструкторы | Замечание. Предположим, класс зависит от того, в каком порядке будут проинициализированы его компоненты
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 429; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.