    TBase *pbase; 
    pbase = new TDerived("String 1",  "String 2"); 

    Рассмотрим что произойдет,  когда программа удалит объект,  на который 
ссылается указатель pbase: 

    delete pbase; // !!! 

    Компилятору было указано, что pbase ссылается на объекты типа TBase и 
программа вызвала бы деструктор TBase при удалении объекта, на который 
ссылается pbase. Но, указатель pbase в действительности ссылается на объект 
класса TDerived, и деструктор этого класса должен быть вызван так же, как и 
деструктор базового класса. 
    Поскольку деструкторы объявлены виртуальными, их вызовы компонуются во 
время выполнения програм мы и объекты сами определяют, какой деструктор 
следует вызвать. Конечно, если деструкторы не виртуальные, вызовется только 
деструктор базового класса, оставив вторую копию строки в памяти, что может 
послу жить причиной серьезной ошибки.

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

    До сих пор в этой главе производные и базовые классы были связаны 
отношением простого наследования Множественное наследование описывает более 
сложную взаимосвязь, в которой один класс может наследовать данные  и 
функции-члены из более, чем одного базового класса. На рис. 14.12 
иллюстрируется концепцш множественного наследования. 

    Базовый класс А      I     Базовый класс В      I        Базовый класс С      I 

                                            Новые данные-члены

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

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

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

    class D:  public A,  public В,  public С {	
     ......                          
    }; 

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

    class D:  public A,   public В,  С {
     ........
    };

    Базовый класс С по умолчанию закрыт, но для ясности статус базового класса 
лучше задавать явным образом, будь он закрытым, защищенным или открытым. Эти 
же правила, изложенные ранее для простого наследования, действуют и в случае 
множественного наследования базовых классов. 
    Множественное наследование отличается лишь тем, что производный класс 
наследует все свойства всех перечисленных базовых классов. В случае конфликта 
имен (например, в двух базовых классах объявляется функция-член с одним и тем 
же именем) следует использовать оператор разрешения видимости для задания 
нужного вам члена класса. Например, предположим, что классы А и В оба имеют 
открытую функцию-член Display(). В производном классе 

    class D:  public A,  public В { 
    public: 
         void f(void); 
         .......
     };

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

    
    360 247 Часть III. Программирование на ANSI C++
