必须在同一个类中进行
子类无法重载父类的函数,父类同名函数将被名称覆盖(C++编译器看到名字相同,不会去父类函数中找名字相同的函数)
重载是在编译期间根据参数类型和个数决定函数调用
必须发生于父类与子类之间
并且父类与子类中的函数必须有完全相同的原型(完全相同)
使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
多态是在运行期间根据具体对象的类型决定函数调用
实例:(如看不懂,文章底部有分析)
#include
using namespace std;
//重写 重载 重定义
//重写发生在2个类之间
//重载必须在一个类之间
//重写分为2类
//1 虚函数重写 将发生多态
//2 非虚函数重写 (重定义)
class Parent
{
//这个三个函数都是重载关系
public:
void abc()
{
printf("abc");
}
virtual void func()
{
cout<<"func() do..."<
virtual void func(int i)
{
cout<<"func() do..."< }
virtual void func(int i, int j)
{
cout<<"func() do..."< }
virtual void func(int i, int j, int m , int n)
{
cout<<"func() do..."< }
protected:
private:
};
class Child : public Parent
{
public:
void abc()
{
printf("child abc");
}
/*
void abc(int a)
{
printf("child abc");
}
*/
virtual void func(int i, int j)
{
cout<<"func(int i, int j) do..."< }
virtual void func(int i, int j, int k)
{
cout<<"func(int i, int j) do.."<< endl;
}
protected:
private:
};
//重载重写和重定义
void main()
{
//: error C2661: “Child::func”: 没有重载函数接受 0 个参数
Child c1;
//c1.func(); //出错,func()函数名称被覆盖了,
//子类无法重载父类的函数,父类同名函数将被名称覆盖
c1.Parent::func();
//1 C++编译器 看到func名字 ,因子类中func名字已经存在了(名称覆盖).所以c++编译器不会去找父类的4个参数的func函数
//2 c++编译器只会在子类中,查找func函数,找到了两个func,一个是2个参数的,一个是3个参数的.
//3 C++编译器开始报错..... error C2661: “Child::func”: 没有重载函数接受 4 个参数
//4 若想调用父类的func,只能加上父类的域名..这样去调用..
c1.func(1, 3, 4, 5);
//c1.func();
//func函数的名字,在子类中发生了名称覆盖;子类的函数的名字,占用了父类的函数的名字的位置
//因为子类中已经有了func名字的重载形式。。。。
//编译器开始在子类中找func函数。。。。但是没有0个参数的func函数
cout<<"hello..."<
return ;
}
实例分析:
1.在单个类中func()函数是函数重载,重载只在同一个类中
2.父类子类中,如果有名称相同,参数相同的函数,则叫做函数重写,如abc(),func(int i, int j)。
3. 父类子类中,名称相同,函数参数不同,父类的同名函数将发生名称覆盖。
实例中调用func()无参函数,报错,因为子类中虽有func()无参函数,但是名称覆盖了,不能这样调用,要显示调用c1.Parent::func();,c++编译器不会去父类的函数中找是否匹配的,直接报错。
注意的是,并不是说子类不能使用父类的函数,如果父类有的函数,子类没有,可以直接调用,只要名字别相同,名字相同就发生名称覆盖。