в классе Panda собственный экземпляр
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
Содержание Назад Вперед