Свойство наследования транзитивно. Например, если я определю новый класс GraduateStudent как подкласс класса student, то он тоже будет наследником person. Это значит, что будет выполняться следующее: если GraduateStudent ЯВЛЯЕТСЯ Student и Student ЯВЛЯЕТСЯ Person, то GraduateStudent ЯВЛЯЕТСЯ Person.
»¦¦¦¦¦¦¦¦¦¦
Ещё один небольшой побочный эффект связан с изменениями, вносимыми в программное обеспечение. Предположим, что вы выполняете наследование некоторого существующего класса. Позже выясняется, что базовый класс работает не совсем так, как требуется порождённому классу, или что в нём имеется ошибка. Изменение базового класса может привести к неработоспособности всего кода, который использует этот базовый класс.
►Как наследуется класс...234
«Здесь приведён пример уже рассмотренного класса GraduateStudent, который дополнен несколькими членами.»
[Диск]
/* InheritanceExample — пример наследования, при */
/* котором конструктор наследника */
/* передаёт информацию конструктору базового класса */
_________________
234 стр. Часть 4. Наследование
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <strings.h>
using namespace std ;
/* Advisor — пустой класс */
class Advisor { } ;
const int MAXNAMESIZE = 40 ;
class Student
{
public :
Student( char *pName = "no name" )
: average( 0.0 ) , semesterHours( 0 )
{
strncpy( name , pName , MAXNAMESIZE ) ;
name[ MAXNAMESIZE - 1 ] = '\0' ;
cout << "Конструктор Student "
<< name
<< endl ;
}
void addCourse( int hours , float grade )
{
cout << "Добавляем оценку для " << name << endl ;
average = ( semesterHours * average + grade ) ;
semesterHours += hours ;
average = average / semesterHours ;
}
int hours( ) { return semesterHours ; }
float gpa( ) { return average ; }
protected :
char name[ MAXNAMESIZE ] ;
int semesterHours ;
float average ;
} ;
class GraduateStudent : public Student
{
public :
GraduateStudent( char *pName , Advisor& adv , float qG = 0.0 )
: Student( pName ), advisor( adv ) , qualifierGrade(qG)
{
cout << "Конструктор GraduateStudent "
<< pName
<< endl ;
}
float qualifier( ) { return qualifierGrade ; }
protected :
Advisor advisor ;
_________________
235 стр. Глава 20. Наследование классов
float qualifierGrade ;
} ;
int main( int nNumberofArgs , char* pszArgs[ ] )
{
/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */
setlocale ( LC_ALL ,".1251" ) ;
Advisor advisor ;
/* Создание двух типов студентов */
Student llu( "Су N Sense" ) ;
GraduateStudent gs( "Matt Madox" , advisor , 1.5 ) ;
/* Добавляем им оценки */
llu.addCourse( 3 , 2.5 ) ;
gs.addCourse( 3 , 3.0 ) ;
// Выводим их
cout << "Оценка Matt = "
<< gs.qualifier( )
<< endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */