多态应该是各种面试中都会问的问题了,那么多态肯定很重要,具体有什么作用呢?我在这里记录下我的了解,以后不断补充
封装:隐藏实现的细节,让代码模块化。
继承:可以扩展已经存在的代码模块(类)。
多态:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,
就是说你想调用一个函数功能,但是这个功能根据具体的对象实现的过程不同。我们可以先定义一个这类对象共同的属性和功能抽象出一个基类,其中的因对象不同的功能函数就用虚函数,然后具体的子类就继承这个类,并重写虚函数,覆盖父类的虚函数。
这样有什么用呢?
class Base{
public:
virtual void fun(){cout<<"ch1";}
};
class Ch1:public Base{
public:
void fun(){cout<<"ch1";}
};
class Ch2:public Base{
public:
void fun(){cout<<"ch2";}
};
比如我们的程序要调用一个函数fun(),这个对象可能是base,Ch1或Ch2甚至Ch3....
如果我们不用虚函数,调用的话就要判断一下
如果是Base b,这样调用:b.fun();
如果是Ch1 c1,这样调用:c1.fun();
如果是Ch2 c2,这样调用:c2.fun();
如果我们用虚函数
将父类指针指向子类,只要调用父类的fun()就行了
Ch1 c1;
Ch2 c2;
Base *pb;
具体是c1就这样:pb=&c1;
如果是c2就:pb=&c2;
只要调用pb->fun()就能调用具体子类的函数了。
还有就是在函数调用的时候,参数类型是父类型,调用可以是子类型:
void fun(base);//声明
可以这样调用:fun(c1);
返回值应该也是可以的,我没试,时间不够了,下次该改,请大家补充。