Составители:
Рубрика:
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<
Страницы
- « первая
- ‹ предыдущая
- …
- 68
- 69
- 70
- 71
- 72
- …
- следующая ›
- последняя »