虚函数在基类中声明,但是不实现,只是在子类继承基类时实现。重载是基类中已经有某个函数,当子类继承时重新实现覆盖了这个函数。
虚函数的函数类型相同,参数相同,返回值相同,也叫覆盖;重载函数的函数类型相同,参数不同,返回值相同.
多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。重载也是用统一的对外接口来完成不同的功能。那么两者有什么区别呢?重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定了。
多态:是指子类重新定义父类的虚方法(virtual,abstract)。当子类重新定义了父类的虚方法后,父类根据赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的。不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。
所谓多态指针的一致,是指“子类虚函数返回的多态指针的静态类型是父类虚函数所返回的多态指针的动态类型集合中的某个类型”
1.多态:
ostream& Base::print(int,ostream&=cout);
ostream& Derived::print(int,ostream&);
2.重载:
Base* Base::copy(Base*);
Base* Derived::copy(Base*);
void Base::eval() const;
void Derived::eval();