Читайте также: |
|
Класс 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Виртуальные функции. | | | ТЕМА 1 СУЩНОСТЬ И ФУНКЦИИ КОРПОРАТИВНЫХ ФИНАНСОВ |