-
函数重写回顾
-
父类中被重写的函数依然会继承给子类
-
子类中重写的函数将覆盖父类中的函数
-
通过作用域分辨符(::)可以访问父类中的函数
Chidl c; Parent*p = &c; c.Parent::print(); //在父类中继承 c.print(); //在子类中重写 p->print(); //父类中定义
-
面向对象中期望的行为?
根据实际的对象类型判断如何调用重写函数,父类指针(引用)指向父类对象则调用父类中定义的函数,如果指向子类对象则调用子类中定义的重写函数。
-
面向对象中多态的概念?
根据实际的对象类型决定函数调用的具体目标,同样的语句在实际运行时有多重不同的表现形态
-
C++语言支持多态的概念
-
通过使用virtual关键字对多态进行支持
-
被virtual声明的函数被重写后具有多态特性
-
被virtual声明的函数叫做虚函数
-
实验
#include <iostream> #include <string> using namespace std; class Parent { public: virtual void printf() { cout << "I'm Parent" << endl; } }; class Child :public Parent { public: void printf() { cout << "I'm Child" << endl; } }; void How_to_printf(Parent*p) { p->printf(); } int main() { Child c; Parent p; How_to_printf(&c); How_to_printf(&p); }
-
运行结果
I'm Child I'm Parent
-
多态的意义
-
在程序运行过程中展现出动态的特性
-
函数重写必须多态实现,否则没有意义
-
多态是面向对象组件化程序设计的基础特性
-
理论中的概念
-
静态联编:在程序的编译期间就能确定具体的函数调用,如函数重载。
-
动态联编:在程序实际运行后才能确定具体的函数调用,如函数重写。
-
小结
-
函数重写只可能发生在父类和子类之间
-
根据实际对象的类型确定调用具体的函数
-
virtual关键字是C++中支持多态的唯一方式
-
被重写的虚函数可以表现出多态的特性