Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Первый пример

Читайте также:
  1. CИТУАЦИОННЫЕ ЗАДАЧИ С ПРИМЕРАМИ РЕШЕНИЯ
  2. CИТУАЦИОННЫЕ ЗАДАЧИ С ПРИМЕРАМИ РЕШЕНИЯ
  3. CИТУАЦИОННЫЕ ЗАДАЧИ С ПРИМЕРАМИ РЕШЕНИЯ
  4. CИТУАЦИОННЫЕ ЗАДАЧИ С ПРИМЕРАМИ РЕШЕНИЯ
  5. IV. «Ты первый» говорит Паулина
  6. V. Первый месяц
  7. VI. Первый месяц

Класс Derived является производным от обоих базовых классов Base1 и Base2.

_______________________________________________________

class Base1 {

int id;

public:

Base1(void) {

cout << “ Constructor Base1”;

id=0;

}

Base1(int anid) {

cout << “ Constructor Base1”;

id=anid;

}

void assignid(int anid) {

id=anid;

}

int accessid(void) {

return id;

}

};

________________________________________________________

class Base2 {

char name[20];

public:

Base2(void) {

cout << “ Constructor Base2”;

strcpy(name,”void”);

}

Base2(char *str) {

cout << “ Constructor Base2”;

strcpy(name,str);

}

void assignName(char *str){

strcpy(name,str);

}

char *accessName(void) { return name; }

};

__

_____________________________________________________

class Derived: public Base1,public Base2 {

char ch;

public:

Derived(void) {

cout << “ Construct Derived”;

ch=‘a’;

}

Derived(char c,int anid,char *str):Base1(anid),Base2(str) {

cout << “ Construct Derived”;

ch=c;

}

void assign(char c) {

ch=c;

}

friend ostream& operator<<(osream& o,Derived& d);

};

ostream& operator<<(ostream& o,Derived& d) {

o<<“id”<<d.accessid()<<“name”<<d.accessName() <<“ ch”<<c;

return o;

}

_________________________________________________

main() {

Derived object1;

cout << object1;

Derived object2(‘e’,26,”Robert”);

cout << object2;

}

Результаты работы программы

Constructor Base1 Constructor Base2 Construct Derived id 0 name void ch a

Constructor Base1 Constructor Base2 Construct Derived

id 26 name Robert ch e

 

 

Сначала создается класс Base1, содержащий закрытую целую переменную, два инициализирующих конструктора (по умолчанию и с параметром), показывающих свой вызов выводом соответствующей строки, и две интерфейсные функции (чтения и записи). Класс Base2 имеет аналогичную функциональность для закрытого символьного массива.

В объявлении производного класса после двоеточия перечисляются все предки этого класса через запятую. Конструктор по умолчанию инициализирует скрытый символ ch, а конструктор с параметрами сопровождается вызовом конструкторов с параметрами классов предков (они перечисляются после двоеточия). Вызов конструктора так же сопровождается выводом надписи на экран. Кроме этого, определяется дружественный оператор вставки в поток <<, который осуществляет вставку в поток ostream данных класса Derived.

В функции main последовательно создается один объект и вывод данных объекта по умолчанию object1 и один объект и вывод данных объекта с параметрами object2.

 

Когда object1 объявлен при помощи выражения Derived object1, вызываются void -конструкторы двух базовых классов в той последовательности, в которой определено наследование (Base1 -конструктор первый, Base2- конструктор второй).

Во втором случае при создании экземпляра object2 вызов конструкторов с параметрами родительского класса так же определяется порядком наследования, т.е. сначала Base1 (anid)затем Base2(str) и Derived(char c,int anid,char *str)

________________________________________________________

Возможны варианты

1. Что, если переписать конструктор Derived c тремя параметрами, как приведено ниже:

 

Derived(char c,int anint,char *str): Base2(str),Base1(anint) { ch=c; }

 

Результат работы программы будет таким же.

 

2. Что, если переписать перегруженный оператор <<, как показано:

 

ostream & operator <<(ostream&o,Derived& d) {

o<<“id”<<d.id<<“name”<<d.name<<“ ch”<<d.c; return o;

}

 

Компилятор выдаст сообщения об ошибке. Производный класс в иерархии множественного наследования не имеет доступа к защищенным экземплярам переменных любых его базовых классов. Оператор вывода << является дружественным классу Derived, но не Base1 и Base2. Поэтому он не имеет прямого доступа к защищенным членам Base1 и Base2.

 

Для корректной работы программы необходимо экземпляры переменных в классах Base1 и Base2 перенести в защищенные секции и изменить перегруженный оператор <<, как предложено выше. Т.к. защищенные экземпляры переменных одного или более базовых классов полностью доступны производным классам.

 


Дата добавления: 2015-07-07; просмотров: 185 | Нарушение авторских прав


Читайте в этой же книге: Средства реализации программного кода | Лекция 2. История развития ООП и сред RAD | Отличия ООП от процедурных программ | Пример для освежения в памяти | Лекция №5 Данные-элементы, статические данные, константные данные | Функции-элементы, дружественные функции, константные функции | Встраиваемые функции inline |
<== предыдущая страница | следующая страница ==>
Виртуальные функции.| ТЕМА 1 СУЩНОСТЬ И ФУНКЦИИ КОРПОРАТИВНЫХ ФИНАНСОВ

mybiblioteka.su - 2015-2024 год. (0.008 сек.)