ob.i = 10; // Теперь неоднозначности нет.
ob.j = 20;
ob.k = 30;
// Теперь неоднозначности нет.
ob.sum = ob.i + ob.j + ob.k;
// Теперь неоднозначности, нет.
cout << ob.i << " ";
cout << ob.j << " " << ob.k << " ";
cout << ob.sum;
return 0;
}
Как видите, ключевое слово
И еще. Даже если оба класса
// Определяем класс типа derived1.
derived1 myclass;
myclass.i = 88;
Разница между обычным базовым и виртуальным классами становится очевидной только тогда, когда этот базовый класс наследуется более одного раза. Если базовый класс объявляется виртуальным, то только один его экземпляр будет включен в объект наследующего класса. В противном случае в этом объекте будет присутствовать несколько его копий.
Глава 15: Виртуальные функции и полиморфизм
Одной из трех основных граней объектно-ориентированного программирования является полиморфизм. Применительно к C++
В C++ полиморфизм поддерживается как во время выполнения, так в период компиляции программы. Перегрузка операторов и функций — это примеры полиморфизма, относящегося ко времени компиляции. Но, несмотря на могущество механизма перегрузки операторов и функций, он не в состоянии решить все задачи, которые возникают в реальных приложениях объектно-ориентированного языка программирования. Поэтому в C++ также реализован полиморфизм периода выполнения на основе использования производных классов и
Начнем же мы эту главу с краткого описания указателей на производные типы, поскольку именно они обеспечивают поддержку динамического полиморфизма.
Фундаментом для динамического полиморфизма служит указатель на базовый класс. Указатели на базовые и производные классы связаны такими отношениями, которые не свойственны указателям других типов. Как было отмечено выше в этой книге, указатель одного типа, как правило, не может указывать на объект другого типа. Однако указатели на базовые классы и объекты производных классов — исключения из этого правила. В C++ указатель на базовый класс также можно использовать для ссылки на объект любого класса, выведенного из базового. Например, предположим, что у нас есть базовый класс
B_class *р; // указатель на объект типа B_class
B_class B_ob; // объект типа B_class
D_class D_ob; // объект типа D_class
обе следующие инструкции абсолютно законны:
р = &В_ob; // р указывает на объект типа B_class
р = &D_ob; /* р указывает на объект типа D_class, который является объектом, выведенным из класса B_class. */
В этом примере указатель