Материалы (11) (1115038), страница 2
Текст из файла (страница 2)
сработает динамическийполиморфизм.Механизм виртуальных функций1.Виртуальность функции, описанной с использованиемслужебного слова virtual не работает сама по себе, онаначинает работать, когда появляется класс производный отданного с функцией с таким же профилем.2.Виртуальные функции выбираются по типу объекта, накоторый ссылается указатель (или ссылка).3.У виртуальных функций должны быть одинаковые профили.Исключение составляют функции с одинаковым именем исписком формальных параметров, у которых тип результатаесть указатель на себя (т.е. соответственно на базовый ипроизводный класс).4.Если виртуальные функции отличаются только типомрезультата (кроме случая выше), генерируется ошибка.5.Для виртуальных функций, описанных с использованиемслужебного слова virtual, с разными прототипами работаетмеханизм замещения, сокрытия имен.Абстрактные классыАбстрактным называется класс, содержащий хотя бы одну чистую виртуальнуюфункцию.Чистая виртуальная функция имеет вид: virtual тип_рез имя ( сп_фп ) = 0;Пример:class shape {public:virtual double area () = 0;};class rectangle: public shape {double height, width;public:double area () {return height * width;}};class circle: public shape {double radius;public:double area () {return 3.14 * radius * radius;}};#define N 100....shape* p [ N ];double total_area = 0;....for (int i =0; i < N; i++)total_area += p[i] -> area();....ИнтерфейсыИнтерфейсами называют абстрактные классы,которые- не содержат нестатических полей-данных, и- все их методы являются открытыми чистымивиртуальными функциями.Реализация виртуальных функцийclass A {int a;public:virtual void f ();virtual void g (int);virtual void h (double);};class B : public A {public:int b;void g (int);virtual void m (B*);};Тогда С с; ~apvtblbcclass C : public B {public:int c;void h (double);virtual void n (C*);};vtbl для A ~ &A:: f для B ~ &A:: f для С ~ &A:: f [0]&A:: g&B:: g&B:: g [1]&A:: h&A:: h&C:: h [2]&B:: m&B:: m [3]&C:: n [4]C c;A *p = &c;p -> g (2); ~ (* ( p -> pvtbl [1]) ) (p, 2); // p = thisВиртуальные функции.
Пример 1.class X {public:void g ( ) {cout << "X::g\n";h ( );}virtual void f() {g ( );h ( );}virtual void h ( ) {cout << "X::h)\n";}};class Y : public X {public:void g ( ) {cout << "Y::g\n";h ( );}virtual void f ( ) {g ( );h ( );}virtual void h ( ) {cout << "Y::h\n";}};int main () {X a, *px;Y b, *py = &b;px = py;px -> f();// Y::gpx -> g();// X::greturn 0;}Y::hY::hY::hВиртуальные функции. Пример 2.#include <iostream>using namespace std;class A {public:virtual int f (int x, int y) {cout << "A::f(int, int)\n";return x+y;}virtual void f ( int x ) {cout << "A::f()\n";}};int main () {A a, *pa = &a;B b, *pb = &b;C c;pa = pb;pa -> f (1); // B::f();pa -> f (1, 2); // A::f(int, int)//pb -> f (1, 2); // ошибка! Эта f не виднаA & ra = c;ra.f(1,1); // C::f(int, int)B & rb = c;//rb.f(0,0); // ошибка! Эта f не виднаreturn 0;class B : public A {public:void f ( int x ) {cout << "B::f()\n";}};}class C : public B {public:virtual int f (int x, int y) {cout << "C::f (int, int)\n";return x+y;}};.