C++ 覆盖与重写是不是一回事
发布网友
发布时间:2022-05-18 18:05
我来回答
共5个回答
热心网友
时间:2023-10-22 09:09
覆盖与重写可以说是一样的,但与重载不同。
override(重写)是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数。在C++中,经常发生在类的继承中。当基类中的某个方法是virtual或pure virtual函数时(当然访问权限必须是public或protected,因为从C++设计思想上来讲private的函数不会是virtual的,呵呵),其子类中对该方法的重新实现就属于override。使用时,可以通过基类的指针或者引用所指向的具体对象来确定调用的是哪个方法,从而实现函数的多态。对于基类中的非virtual类型的成员函数,若其子类中也声明了与该函数名称相同的函数,那么基类中的该函数(也许是一系列函数,如果该函数在基类中有重载的话,呵呵)将被隐藏,可以通过域解析操作符来调用。不过按照C++的设计思想来说呢,基类中的非virtual类型的成员函数,是不需要在子类中进行修改的,所以如果在子类中出现了这种隐藏的情况,说明应该将基类中的该函数改成virtual类型的,然后就是override了。
overload(重载)则是指在相同作用域中,多个函数具有相同的名字,但参数的数目和类型各不相同(当然相同数目和类型,如果顺序不同也是可以的),因为函数重载的机制是在C++中函数的签名与其参数有关,而不像C中,只与函数名有关。总之,override与overload的一个最大的区别就是作用域不同,以及函数原型是否相同,呵呵。
函数的重载(overload)覆盖(override)隐藏
派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有VIRRUAL关键字.些时基类的函数将被隐藏,而不是覆盖.
派生类的函数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函数声明是否有VIRRUAL关键字,基类的函数都将被隐藏.注意这种情况与重载的区别,重载发生在同一个类中。
热心网友
时间:2023-10-22 09:09
当然是不同的,
覆盖也就是隐藏,派生类和基类的函数名相同,并且要求基类函数不为虚函数;
否则就成了重写了
重写虚函数必须返回类型一致,名称一致,且参数一致;
不管重写或者是覆盖都是为了实现运行时的多态,亦决定了调用父类还是子类的函数。
覆盖既然隐藏了当然是各调各的了。
热心网友
时间:2023-10-22 09:09
楼主的理解是正确的。
frogoscar提供的信息相当全。简而言之就是,当子类中有跟基类相同定义的函数时,
△ 基类(含基类的基类)中该函数声明里如果都没有virtual的话,则是隐藏,生成的子类对象中调用的该函数是子类自己的成员函数而非继承来的基类的同名函数;
△如果基类该函数声明中有virtual,则为改写(override),实现多态:让基类指针p指向子类对象后,通过p调用该函数,其实是调用的子类的该成员函数。
热心网友
时间:2023-10-22 09:10
重载是相同函数名,但函数的参数不能完全相同。例如:
int f();
int f(int a);
这是重载。
重写是子类的函数实现覆盖了父类的函数实现,函数名和参数都要相同。例如:
class Base{
void f(){cout << "Base::f()" << endl;}
}
class Derive:public Base{
}
这种情况下通过子类对象调用f()函数就是使用的父类的函数
Derive d;
d.f();
会输出 Base::f()
而
class Base{
void f(){cout << "Base::f()" << endl;}
}
class Derive:public Base{
void f(){cout << "Deive::f()" << endl;}
}
这种情况下通过子类对象调用f()函数就是使用的自己的函数
Derive d;
d.f();
会输出 Derive::f()
热心网友
时间:2023-10-22 09:11
你这里说的覆盖与重写应该是一回事。
只不过在标准c++定义中不是这种叫法。