1.1 多态引出 1.1.1 重写
父类中被重写的函数依然会继承给子类子类中重写的函数将覆盖父类中的函数通过作用域分辨符(::)可以访问到父类中的函数子类中为啥要重写父类中定义的函数呢?因为父类中的这个函数不满足子类的需求 Child c; Parent * p =&c; c.Parent::print() // 调用父类中的print函数 c.print(); //调用子类中的print函数(在子类中进行了重写) p->print(); //调用父类中定义的print函数1.1.2 代码实例
#include <iostream> using namespace std; class Parent { public: void print() { cout << "I am parent "<<endl; } }; class Child :public Parent { public: void print() { cout<<"I am child "<<endl; } }; void howToPrint(Parent * p) { p->print(); } int main() { Child c; Parent p; howToPrint(&p); //expect to print father; howToPrint(&c); //expect to print child return 0; }上面的代码期望调用父类对象时候,打印父类的print函数的内容,调用子类对象的时候,打印子类对象的print 函数。 实际的打印结果如下
1.1.3 面向对象中期望的行为
根据实际的对象类型来判断如何调用重写函数父类指针(引用)指向 (1)父类对象则调用父类中定义的函数 (2)子类对象则调用子类中定义的重写函数1.2 面向对象中多态
1.2.1多态的概念
根据实际的对象类型决定函数调用的具体目标同样的调用语句在实际运行时有多种不同的表现形态当p指针指向父类对象时候,调用父类的print()函数当p指针指向子类对象的时候,调用子类的print()函数1.2.2 C++语言中支持多态的概念
通过使用virtual 关键字对多态进行支持被virtual声明的函数被重写以后拒用多态特性被virtual声明的函数叫虚函数1.2.3 在上面的例子中,只需要在父类中print函数前加上virtual就可以实现多态了。 1.2.4多态的意义:
在程序运行过程中展现动态特性函数重写必须多态实现,否则没意义多态是面向对象组件化程序设计的基础特性。1.2.5 理论中的概念
静态联篇 在程序的编译期间就能确定具体的函数调用 动态联篇 在程序的实际运行后才能确定具体的函数调用1.2.6 示例一
class Parent { public: void func() { cout<<"parent void func() "<<endl; } void func(int a) { cout<<"parent void func(int a) "<<endl; } virtual void func(int a,int b) { cout<<"parent void func(int a,int b) "<<endl; } }; class Child :public Parent { public: void func(int a,int b) { cout<<"child void func(int a,int b) "<<endl; } void func(int a,int b,int c) { cout<<"child void func(int a,int b,int c) "<<endl; } }; void how_to_print(Parent * p) { p->func(1,2); } int main() { Parent p; p.func(); //静态联编 p.func(1); //静态联编 p.func(1,2); //静态联编 cout<<endl; Child c; c.func(1,2); //静态联编 c.func(1,2,3); //静态联编 cout<<endl; how_to_print(&p); //动态联编 how_to_print(&c); //动态联编 return 0; } 要抓住本质1.2.7 示例二
多态思想解释江湖恩怨。 class Boss { public: int fight() { int ret =10; cout<<"Boss::fight(): "<<ret <<endl; return ret; } }; class Master { public: virtual int eightSwordFight() { int ret = 8; cout<<"Master::fight(): "<<ret <<endl; return ret; } }; class NewMaster :public Master { public: virtual int eightSwordFight() { int ret = Master::eightSwordFight() * 2; cout<<"NewMaster::fight(): "<<ret <<endl; return ret; } }; void pk(Boss * boss, Master * master) { int a = boss->fight(); int b = master->eightSwordFight(); if(a < b) { cout<< "boss is killed" <<endl; } else{ cout<<"master is killed"<<endl; } } int main() { Boss boss; Master master; pk(&boss,&master); cout<<endl; NewMaster newmaster; pk(&boss,&newmaster); return 0; }参考一 :狄泰软件学院C++进阶剖析 参考二 : C++ primer中文版