С++ для начинающих



         

Множественное наследование - часть 4


   virtual string isA() const;

   // ...

};

class Endangered {

public:

   virtual ~Endangered();

   virtual ostream& print( ostream& ) const;

   virtual void highlight() const;

   // ...

};

Теперь определим в классе Panda собственный экземпляр print(), собственный деструктор и еще одну виртуальную функцию cuddle():

class Panda : public Bear, public Endangered

{

public:

   virtual ~Panda();

   virtual ostream& print( ostream& ) const;

   virtual void cuddle();

   // ...

};

Множество виртуальных функций, которые можно напрямую вызывать для объекта Panda, представлено в табл. 18.1.

Таблица 18.1. Виртуальные функции для класса Panda

Имя виртуальной функции

Активный экземпляр

деструктор

Panda::~Panda()

print(ostream&) const

Panda::print(ostream&)

isA() const

Bear::isA()

highlight() const

Endangered::highlight()

cuddle()

Panda::cuddle()

Когда ссылка или указатель на объект Bear или ZooAnimal инициализируется адресом объекта Panda или ему присваивается такой адрес, то части интерфейса, связанные с классами Panda и Endangered, становятся недоступны:

Bear *pb = new Panda;

pb->print( cout );      // правильно: Panda::print(ostream&)

pb->isA();              // правильно: Bear::isA()

pb->cuddle();           // ошибка: это не часть интерфейса Bear

pb->highlight();        // ошибка: это не часть интерфейса Bear

delete pb;              // правильно: Panda::~Panda()

(Обратите внимание, что если бы объекту класса Panda был присвоен указатель на ZooAnimal, то все показанные выше вызовы разрешались бы так же.)

Аналогично, если ссылка или указатель на объект Endangered инициализируется адресом объекта Panda или ему присваивается такой адрес, то части интерфейса, связанные с классами Panda и Bear, становятся недоступными:

Endangered *pe = new Panda;

pe->print( cout );  // правильно: Panda::print(ostream&)

// ошибка: это не часть интерфейса Endangered




Содержание  Назад  Вперед