重写的返回类型于被重写的返回类型可以不相同,但是必须是父类返回值的派生类。此说法正确吗
时间: 2024-03-09 13:50:55 浏览: 112
这个说法基本上是正确的,但需要做出一些说明。在重写方法时,子类方法的返回类型必须与父类方法的返回类型相同或者是其子类,这是为了保证子类方法可以完全替代父类方法。如果子类方法的返回类型比父类方法更加宽泛,就有可能导致使用子类方法的地方无法正常工作。例如,以下是一个重写的例子:
```java
public class Animal {
public Object eat() {
System.out.println("Animal is eating.");
return null;
}
}
public class Dog extends Animal {
@Override
public String eat() {
System.out.println("Dog is eating.");
return "";
}
}
```
在上面的代码中,`Dog` 类重写了 `Animal` 类的 `eat()` 方法,并将返回类型从 `Object` 改为了 `String`。然而,这是不合法的重写,因为 `String` 类型不是 `Object` 类型的子类,这就违反了上述规则。如果我们使用 `Dog` 对象调用 `eat()` 方法,就会出现编译错误。
因此,虽然重写方法的返回类型可以是父类返回值的派生类,但是必须要满足子类方法返回类型是父类方法返回类型的子类型,否则会导致编译错误。
相关问题
: 派生类中有一个跟基类完全相同的虚函数 ( 即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同 ) ,称子类的虚函数重写了基类的虚函数。
当一个派生类中的函数与基类声明的一个虚函数有着完全相同的参数列表、返回值类型以及函数名时,这种情况被称为子类对基类的虚函数进行了“重写”或“覆盖”。这种重写允许子类提供其自身的实现版本,即使在基类指针或引用上调用这个函数,实际上会执行的是子类的版本。这是多态性的一种体现,因为通过动态绑定(运行时确定调用哪份代码),可以根据实际的对象类型来调用相应的函数。
重写虚函数有以下几个关键点:
1. 要标记为 virtual 或者 override(C++11及以后)来声明为虚函数,以便让编译器支持动态绑定。
2. 子类需要明确地重写该虚函数,即在派生类中提供对应的函数体。
3. 如果基类的虚函数是一个纯虚函数(没有实现),那么派生类必须提供其实现,否则会生成一个抽象类。
是指派生类中存在与基类同名同参数且返回值也相同的成员函数。
是的,函数重载指在同一个作用域内,存在多个同名但参数列表不同的函数。而函数重写(override)指的是在派生类中存在一个与基类同名、同参数列表、同返回值类型的成员函数,这个成员函数会覆盖基类中的同名函数,从而在使用派生类对象调用这个函数时,实际上会调用派生类中的这个函数而不是基类中的函数。函数重写是实现多态的重要手段之一。
阅读全文