Объектно-ориентированное программирование на языке С++. Лясин Д.Н - 70 стр.

UptoLike

Составители: 

70
В данном случае объект класса F будет включать три экземпляра класса A:
один виртуальный, совместно используемый классами B и С, и два
невиртуальных, относящихся к классам E и D.
4.5. Виртуальные функции. Полиморфизм
Рассмотрим еще один пример.
//Листинг 29. Проблема статического связывания функций
class Base
{ public:
int func1(int x) {return x*x;}
int func2(int x){return func1(x)/2;}
};
class Child: public Base
{public:
int func1(int x) {return x*x*x;}
};
main()
{ Child c;
cout<<c.func2(5); //на экран выводится 12
Base *ptb=new Child;
cout<<ptb->func1(2); //на экран выводится 4
cout<<c.func1(2); // на экран выводится 8
}
В классе Base определены две функции func1 и func2, причем вто-
рая функция вызывает первую. В классе Child переопределена функция
func1, а функция func2 просто наследуется. При вызове функций резуль-
таты их работы оказываются для многих неожиданными. Так, вызов
А
E
F
Рисунок 12. - Использование одного и того же класса как виртуальной, так
и невиртуальной базы
D
А
B
C
А
         А                            А                             А

                     E          B           C         D


                                      F
       Рисунок 12. - Использование одного и того же класса как виртуальной, так
                             и невиртуальной базы

       В данном случае объект класса F будет включать три экземпляра класса A:
один    виртуальный,      совместно       используемый         классами     B   и   С,   и   два
невиртуальных, относящихся к классам E и D.


       4.5. Виртуальные функции. Полиморфизм


       Рассмотрим еще один пример.
          //Листинг 29. Проблема статического связывания функций
          class Base
          { public:
          int func1(int x) {return x*x;}
          int func2(int x){return func1(x)/2;}
          };
          class Child: public Base
          {public:
          int func1(int x) {return x*x*x;}
          };
          main()
          { Child c;
          cout<func1(2);           //на экран выводится 4
          cout<