C++:重载,重定义,重写的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/han8040laixin/article/details/81703244

这是比较容易混淆的概念,在此整理,以便理解。

一:重载
重载指的是在同一个作用域内,两函数的函数名可以相同,但是参数不能完全相同,可以是参数类型不同或者是参数个数不同,至于返回值,不影响重载。

如图,构成了重载:
这里写图片描述

如何实现重载?
C++代码在编译时会根据参数列表对函数进行重命名,例如void Test(int a, int b)会被重命名为_Test_int_int,void Test(int x, double y)会被重命名为_Test_int_double。所以说函数重载从底层上看它们还是不同的函数。

二:重定义
重定义也叫隐藏,指的是在继承关系中,子类实现了一个和父类名字一样的函数,(只关注函数名,和参数与返回值无关)这样的话子类的函数就把父类的同名函数隐藏了。
举个例子,下面程序的运行结果为:

class A{
public:
    void f()
    {
        cout << "A" << endl;
    }

public:
    int _x;
};

class B : public A{
public:
    void f(int a)
    {
        cout << "B" << endl;
    }

public:
    int _x;
};

void test1()
{
    B b;
    b.f();
}

很明显,子类隐藏了父类的f函数,这个题目比较迷惑人的是子类的f函数有参数,所以会以为调的是父类的f函数;
但是隐藏只与函数名有关,与参数是没关系的,所以调用的还是子类的f函数,这个程序就跑不过。

三:重写
重写指的在继承关系中,子类中定义了一个与父类极其相似的虚函数。
具体怎么相似:函数名必须相同,参数列表必须相同,返回值可以不相同,但是必须是父子关系的指针或引用。

通过重写,可以实现动态多态,何为动态多态,就是当父类的指针或引用指向被重写的虚函数时,父类的指针或引用指向谁就调用谁的虚函数,而不是说根据类型。
在这里,如果去掉父类的虚函数的virtual,则构不成多态,如果去掉子类虚函数的virtual可以构成多态,可以理解为编译器优化。

猜你喜欢

转载自blog.csdn.net/han8040laixin/article/details/81703244
今日推荐