重写(Override)和重载(Overload)是面向对象编程中常用的两个概念,它们虽然都涉及到方法的定义,但是在实现和使用上有着不同的特点。
重写(Override):
重写是指在子类中重新定义(覆盖)了父类中的某个方法,方法名、参数列表和返回类型必须完全一致。重写的目的是为了在子类中修改或者扩展父类方法的行为,使得子类能够根据自身的特点来实现特定的功能,当子类对象调用被重写的方法时,将执行子类中的方法,而不是父类中的方法。
示例:
//父类
class Animal
{
public:
Animal(){};
~Animal(){};
//动物:吃行为
void eat(){
std::cout << "Eat 函数" << std::endl;
}
};
//子类
class Cat : public Animal
{
public:
Cat(){};
~Cat(){};
//子类中重写eat方法
void eat() {
std::cout << "Cat Eat 函数" << std::endl;
}
};
在Cat
类中定义了一个与父类中eat()
函数同名的函数,这是方法的重写。这意味着当在Cat
类的对象上调用eat()
函数时,将会执行Cat
类中的eat()
函数而不是父类中的eat()
函数。
那么此时再程序中创建Cat对象并调用其eat函数:
int main() {
Cat * catObjA = new Cat;
catObjA->eat();
delete catObjA;
system("pause");
return 0;
}
结果为:
如果这个时候还想使用子类对象调用其父类的成员方法时就需要使用::
符号进行调用:
int main() {
Cat * catObjA = new Cat;
//子类中的eat方法
catObjA->eat();
//调用父类中的eat方法
catObjA->Animal::eat();
delete catObjA;
system("pause");
return 0;
}
此时就能够正常调用父类中的成员方法:
重载(Overload):
重载是指在同一个类中定义多个方法,它们具有相同的名称但是参数列表不同(参数类型、参数个数或参数顺序不同)的特点,重载的目的是为了让方法在功能上相似但参数不同的情况下能够使用相同的名称,从而提高代码的可读性和易用性。编译器根据方法调用时提供的参数列表来确定调用哪个重载版本的方法。
示例:
class Cat
{
public:
//函数重载
void run() {
std::cout << "Cat Run 函数" << std::endl;
}
void run(int acount) {
std::cout << acount << "个 Cat Run 函数" << std::endl;
}
void run(int a,int b) {
std::cout << a+b << "个 Cat Run 函数" << std::endl;
}
}
这段代码展示了C++中的函数重载(Function Overloading)的情况;一个简单的类,其中包含了三个名为run()
的成员函数,它们的参数列表不同。
-
第一个
run()
函数没有参数,当调用它时,输出"Cat Run 函数"。 -
第二个
run()
函数接受一个整数参数acount
,当调用它时,输出"acount 个 Cat Run 函数"。 -
第三个
run()
函数接受两个整数参数a
和b
,当调用它时,输出"a + b 个 Cat Run 函数"。
这种情况被称为函数重载。函数重载是指在同一个作用域内定义了多个名称相同但参数列表不同的函数。编译器会根据调用时提供的参数类型和数量来决定调用哪个版本的函数。
在主函数中进行Cat对象创建且调用cat对象中重载的run方法:
int main() {
Cat * catObj = new Cat;
catObj->run();
catObj->run(1);
catObj->run(1, 2);
delete catObj;
system("pause");
return 0;
}
编译器自动根据调用时提供的参数类型和数量来决定调用哪个版本的函数。