本帖最后由 奋斗丶小Z 于 2016-2-10 20:14 编辑
C++多态主要体现在子类父类关系。 多态进阶与重载函数。 重载函数要求参数的位置,参数的名称,参数的多少总有不同的地方,且函数同名。 在函数同名的情况下,如果函数的参数的位置,参数的名称,参数的多少都一样。 到底是打印父类的函数,还是打印子类的函数呢? 如果是打印子类,就叫覆盖或重写。可以理解为父类和子类的同名函数被子类的函数覆盖了。 可以说:在基类中定义了一个非虚拟函数,然后在派生类中又定义了一个同名同参数同返回类型的函数,这就是覆盖了。在派生类对象上直接调用这个函数名,只会调用派生类中的那个。 实际上,函数怎么选择。用虚函数处理比较简单。 如果没用虚函数。就用基类或父类中的函数。 如果用了虚函数了。就用派生类或子类中的函数。 我搜集的代码如下: [tr] [td=932] #include<iostream> using namespace std; class A{//虚函数示例代码2 public: virtual void fun(){cout<<"A::fun"<<endl;} virtual void fun2(){cout<<"A::fun2"<<endl;} }; class B : public A{ public: void fun(){cout<<"B::fun"<<endl;} void fun2(){cout<<"B::fun2"<<endl;} };//end//虚函数示例代码2 int main() { void(A::*fun)();//定义一个函数指针 A *p=new B; fun=&A::fun; (p->*fun)(); fun=&A::fun2; (p->*fun)(); delete p; system("pause"); return 0; } [/td] [/tr]误区 你能估算出结果吗?如果你估算出的结果是A::fun和A::fun2,呵呵,恭喜恭喜,你中圈套了。其实真正的结果是B::fun和B::fun2。所以呢。这里发生了覆盖。 看下面的代码。去除了虚函数virtual.答案就是A::fun和A::fun2。很正常吧?这里用虚函数实现了多态。 #include<iostream> using namespace std; class A{//虚函数示例代码2 public: void fun(){cout<<"A::fun"<<endl;} void fun2(){cout<<"A::fun2"<<endl;} }; class B : public A{ public: void fun(){cout<<"B::fun"<<endl;} void fun2(){cout<<"B::fun2"<<endl;} };//end//虚函数示例代码2 int main() { void(A::*fun)();//定义一个函数指针 A *p=new B; fun=&A::fun; (p->*fun)(); fun=&A::fun2; (p->*fun)(); delete p; system("pause"); return 0; } |