引喻(metaphore)是借着某一种熟悉的事物(喻体)来阐述另外一种不熟悉的事物(本体:比如c++代码),这两种事物可能差别很大。如果对喻体逻辑的解释辑不通,那么本体的自身逻辑极有可能是错误的。
格码大叔强调一下:我们用形象的方法阐述一个抽象道理时,如果形象的道理都说不通,那么对应的抽象道理极有可能也是错的。如果能阐述通,那么其对应的抽象喻体(即C++代码)更容易理解或者逻辑上行得通的概率大增。
假设一个喻体场景:党中央向全国发起了向雷锋同志学习的号召.党中央自身以身作则,展开了向雷锋同志学习的行动。下面的各个部门行动一致,积极响应,也都展开了向雷锋同志学习的行动。后期,党中央检查组对全国的工作展开了巡查,假设上级检查部门人力不足,部分检查工作可以委托给下面的某部门来完成。
上述喻体场景在生活中是实实在在存在的,在逻辑上是行得通的。
代码如下:
#include<iostream> using namespace std; //虚函数是C++中用于实现多态(polymorphism)的机制. //虚函数,那些被virtual关键字修饰的类成员函数,就是虚函数. //核心理念就是通过基类访问派生类定义的函数. //虚函数的作用,将接口与实现进行分离. class PartyCenter //党中央类 { public: virtual void LearnFromComradeLeiFeng(); // 党中央发起【向雷锋同志学习】的号召 virtual void PartyCenterPatrol(); // 党中央巡查组只负责后期对这个号召的执行情况的进行监督【巡查 】 }partyCenter; void PartyCenter::LearnFromComradeLeiFeng() { cout<<"党中央以身作则,也开始学雷锋做好人好事:慰问贫困家庭,访问敬老院,..."<<endl; } void PartyCenter::PartyCenterPatrol() { cout<<"党中央开始了巡视检查工作."<<endl; } class SubDepartmentA:public PartyCenter { void LearnFromComradeLeiFeng(); }subDepartmentA; //部门A需要响应号召. class SubDepartmentB:public PartyCenter { void LearnFromComradeLeiFeng(); void PartyCenterPatrol(); }subDepartmentB; //部门B需要响应号召,另外,当党中央人力不足时,可以代表党中央进行巡查工作. void SubDepartmentA::LearnFromComradeLeiFeng() { cout<<"A下级部门响应党的号召,开始学雷锋做好人好事:打扫公共卫生,修理电器,..."<<endl; } void SubDepartmentB::LearnFromComradeLeiFeng() { cout<<"B下级部门响应党的号召,开始学雷锋做好人好事:自助贫困学生,..."<<endl; } void SubDepartmentB::PartyCenterPatrol() { cout<<"(B下级部门)代表党中央,也开始了巡视检查工作...."<<endl; } int main(int argc, char* argv[]) { PartyCenter *pPC; pPC=&partyCenter; pPC->LearnFromComradeLeiFeng(); //党中央自身:步调一致,开始向雷锋同志学习 pPC=&subDepartmentA; pPC->LearnFromComradeLeiFeng(); //部门A:步调一致,开始向雷锋同志学习 pPC=&subDepartmentB; pPC->LearnFromComradeLeiFeng(); //部门B:步调一致,开始向雷锋同志学习 pPC=&partyCenter; pPC->PartyCenterPatrol(); //党中央巡查组开始巡查 pPC=&subDepartmentB; pPC->PartyCenterPatrol(); //假设上级检查部门人力不足,B部门代表党中央巡查组,也开始检查 return 0; }
向雷锋同志学习是一个【号召】,所以在PartyCenter类中需要一个【虚函数】的声明。
号召在中央本部及下面部门执行的方法内容都不一样,所以,具体虚函数定义多种多样。但步调一致,都是学雷锋。对于代码来讲,就是指针的学雷锋调用方法是一致的。
检查组去下面检查,不管是中央本部检查组,还是委托的的检查组,对于下面的被检查的人来说,分不清,检查组对外的表现形式是一样的。对于代码来讲,就是指针的巡查组调用方法都是一样的。
格码大叔对虚函数特点小结:
- 1.父类虚函数提口号,主要由子类来实现。
- 2.父类及子类的虚函数调用,行动步调可一致性,但具体内容呈多样性。
- 3.子类的虚函数可替父类虚函数默默工作,且外界不易察觉。