覆盖与重载与隐藏的区别与联系c++
时间: 2024-08-16 22:09:10 浏览: 31
覆盖、重载和隐藏都是C++中与函数或成员函数相关的术语:
1. **重载** (Overload):
- 它是指在同一作用域内,可以有多个同名函数,但它们的参数列表(即参数类型、个数或顺序)不同。这样可以根据传入的实际参数类型自动选择合适的函数执行。
2. **覆盖** (Overriding):
- 这是在继承层次结构中发生的,子类提供了一个与父类同名、同参数列表(包括返回类型)的方法。当通过父类指针或引用调用这个方法时,实际执行的是子类的方法。这是多态的一个体现,用于实现运行时的行为改变。
3. **隐藏** (Hiding):
- 当子类中有与基类同名的非虚函数时,基类的该函数就会被隐藏。在这种情况下,如果仅通过基类指针访问,会直接调用基类的函数,不会看到子类的修改。只有通过子类对象才能访问到子类版本的函数。
**区别与联系**:
- 重载关注的是同名函数,通过参数差异区分;
- 覆盖则是继承中的一种,强调的是行为替换;
- 隐藏则是隐藏了继承关系中的某个函数,需要通过子类访问子类版本。
相关问题
.编写代码实现成员函数的重载、覆盖与隐藏
在面向对象编程中,成员函数的重载(Overloading)、覆盖(Overriding)和隐藏(Hiding)是为了提供更丰富的功能和灵活性。
1. **重载(Overloading)**:在同一类中,可以定义两个或多个同名函数,但它们的参数列表不同(包括参数的数量、类型或顺序)。例如,在C++中:
```cpp
class MyClass {
public:
void print(int num) { /* 打印整数 */ }
void print(double num) { /* 打印双精度浮点数 */ }
};
```
这里,`print`函数就是重载的,根据传入的参数类型会选择合适的实现。
2. **覆盖(Overriding)**:当继承自父类并有一个同名的方法时,可以在子类中提供自己的实现,这称为方法重写。如果在子类实例上通过父类引用调用该方法,会执行子类的方法。例如,Java中的覆盖:
```java
class Parent {
public void display() {
System.out.println("Parent class");
}
}
class Child extends Parent {
@Override
public void display() {
System.out.println("Child class");
}
}
```
在`Child`类中,`display`方法就覆盖了父类`Parent`的`display`方法。
3. **隐藏(Hiding)**:如果父类中存在方法,而子类也定义了一个同名但不同签名的方法,那么子类的方法会“隐藏”父类的方法,仅对子类的对象可见。但在Java中,为了避免意外隐藏,通常推荐使用`@Override`注解来明确意图,并在子类中声明该方法。
类成员函数的重载、覆盖和隐藏区别
类成员函数的重载、覆盖和隐藏是C++中常见的概念,它们的区别如下:
1. 重载(overloading):指在同一个类中,函数名相同但参数列表不同,用于处理不同类型和数量的参数。重载函数会根据传入参数的类型和数量来选择调用哪个函数。
2. 覆盖(override):指派生类中的函数覆盖了基类中的同名函数,用于实现多态性。覆盖函数的参数列表必须与被覆盖的函数相同,返回类型可以相同或派生类型。
3. 隐藏(hide):指派生类中定义了与基类中同名的函数,但参数列表不同,这种情况下基类的函数被隐藏了。调用被隐藏的函数时,会调用派生类的函数而不是基类的函数。
总之,重载是函数名相同但参数列表不同,覆盖是派生类中的函数覆盖了基类中的同名函数,隐藏是派生类中定义了与基类中同名的函数但参数列表不同。