函数重载、函数重写、函数重定义的区别

函数重载

必须在同一个类中进行

子类无法重载父类的函数,父类同名函数将被名称覆盖(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..."<     system("pause");
    return ;
}
实例分析:

1.在单个类中func()函数是函数重载,重载只在同一个类中

2.父类子类中,如果有名称相同,参数相同的函数,则叫做函数重写,如abc(),func(int i, int j)。

  • abc()函数前面没有virtual,是函数重定义
  • func(int i, int j)前面有virtual,则是虚函数重写,将发生多态

3. 父类子类中,名称相同,函数参数不同,父类的同名函数将发生名称覆盖。

实例中调用func()无参函数,报错,因为子类中虽有func()无参函数,但是名称覆盖了,不能这样调用,要显示调用c1.Parent::func();,c++编译器不会去父类的函数中找是否匹配的,直接报错。

注意的是,并不是说子类不能使用父类的函数,如果父类有的函数,子类没有,可以直接调用,只要名字别相同,名字相同就发生名称覆盖。

你可能感兴趣的:(c++知识)