一、定义
重载:重载指的是在同一个类中发生的,两个成员函数拥有相同的名称,但是他们的参数不一样。
但是不能通过返回类型来判断。
重定义:重定义也叫隐藏。它是发生的子类父类中的,即它的发生条件是继承。子类重新定义和父
类相同的函数他们的参数列表可以不同。(重定义的是父类的非虚函数)
重写:也叫覆盖。它也是发生在子类中的,即它发生的条件也是继承关系。当我们对别人提供的方
法不满意时,我们可以通过继承这个类然后将其方法改成我们需要的逻辑。
(1)、被重写的函数不能是static的。
(2)、函数的三要素(函数名、函数参数、函数返回值)完全一样。
(3)、virtual函数重新是多态产生的必要条件之一。
二、应用
重载:
重载可以通过调用相同的函数名来实现不同数据类型的运算。
class A { public : int a ; char b[10]; void get_a(int &a) { this->a = a; printf("%d",this->a); } void get_a(const char *c) { strcpy(this->b,c); printf("%s",this->b); } }; int main() { int a= 10; const char *b= "sos"; A d; d.get_a(b); d.get_a(a); }
重定义(也叫隐藏):
class A { public : int a ; void get_a(int &b) { this->a = b; printf("%d",this->a); } }; class b :public A { public : char b[10] ; void get_a(const char *p) { strcpy(this->b,p); printf("%s",this->b); } }; int main() { int a=2; const char *p ="lucifer"; b c; c.get_a(p); //c.get_a(a); //此时这句话会报错说明是否参数类型的改变,默认调用子类的函数 c.A::get_a(a); //这是父类函数的调用方法 }
重写:
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; class A { public : int a ; virtual void get_a(int &b) { this->a = b; printf("%d",this->a); printf("这是父类函数"); } }; class b:public A { public : int b; virtual void get_a(int &c) { this->b = c; printf("%d",this->b); printf("这是子类函数"); } }; int main() { int a=1; A *p = NULL; b c; p = &c; p->get_a(a); //这个函数的调用取决于父类函数有无virtual修饰,若有则调用子类的,否则调用父类的。 }
上面这个其实就产生了多态,不过我会专门去说说多态。
!欢迎各位来指出不足之处