为什么在Java和C ++中不允许隐藏虚拟函数/方法?

阿西夫·穆斯塔克(Asif Mushtaq)
#include <iostream>
class A{
    public:
        void k(){
            std::cout << "k from A";
        }
};
class B:public A{
    public:
        int k(){
            std::cout << "k from B"; 
            return 0;
        }
};
int main(){
    B obj;
    obj.k();

    return 0;
}

没有虚拟的情况下,它工作正常,但是当我将A函数更改为虚拟时,这就是说返回类型应该为什么相同?

我在Java中尝试了同样的事情:

class X{
    public void k(){
        System.out.println("k From X");
    }
}
public class Y{
    public int k(){
        System.out.println("k From Y");
        return 0;
    }
}

当我在子类中尝试其他返回类型时,Java也显示错误。(我认为因为默认情况下所有实例方法默认都是虚拟的),我期望int k()应该隐藏void k()int k()应该从Y的对象调用

所以我认为这是虚拟的问题。当将函数声明为虚函数时,为什么子类应使用相同的返回类型?

如果是多态行为问题。然后我认为对象足以确定函数调用。

例子:

class X{
    public void k(){
        System.out.println("k From X");
    }
}
public class Y extends X{
    public int k(){
        System.out.println("k From Y");
        return 0;
    }
    public static void main(String[] args){
        X obj=new Y();
        obj.k(); // object Y found now just call k() from Y.
    }
}

为什么我们不能在子类或子类中更改返回类型?

迪玛

您猜对了,“多态”是关键字:)多态意味着,如果Y是的子类X,则Y有效地 X,并且可以在X任何地方使用。

现在,这意味着,如果X具有method void k(),那么Y还必须具有相同的方法(否则,您将无法使用X)。但是您不能有两个具有相同签名的不同方法,因此也Y.k()必须返回void(否则,它将是一个不同的方法)。

在C ++情况下,非虚函数不是多态的:A.k并且B.k在这种情况下是两种完全不同的方法,因此没有限制。

简而言之,让我们稍微更改一下示例:假设您定义X.k了returnintY.k()as void想象一下这样的函数:

     int plusOne(X x) {
        return x.k() + 1
     }

这样可以编译工作,对吗?但是呢plusOne(new Y())这也必须起作用,因为YX...,但是,如果有可能Y.k()返回一个空值,该怎么plusOne办?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在函数中不允许“从...导入*”?

来自分类Dev

为什么 \empty 和 \isset 在 php 中是不允许的

来自分类Dev

为什么在Java中不允许这种向下转换?

来自分类Dev

为什么Java 8的注释类型中不允许使用默认方法?

来自分类Dev

为什么C ++中不允许int&a = <value>?

来自分类Dev

在C ++不允许虚拟模板方法的情况下,C#如何允许虚拟通用方法?

来自分类Dev

在C ++不允许虚拟模板方法的情况下,C#如何允许虚拟通用方法?

来自分类Dev

为什么在Java中不允许赋值和不带括号的布尔运算符

来自分类Dev

从构造函数分配Final变量| 不允许使用方法。为什么?

来自分类Dev

从构造函数分配Final变量| 不允许使用方法。为什么?

来自分类Dev

为什么Kotlin在主构造函数中不允许任何代码?

来自分类Dev

matplotlib,为什么散点函数中不允许使用自定义标记样式

来自分类Dev

为什么函数参数名称中不允许使用下划线?

来自分类Dev

D为什么不允许嵌套函数重载?

来自分类Dev

为什么不允许抽象构造函数?

来自分类Dev

为什么Scala特性不允许构造函数参数?

来自分类Dev

为什么不允许我提供函数参数?

来自分类Dev

为什么不允许数字函数名称?

来自分类Dev

为什么Java不允许在构造函数中初始化静态最终变量(例如static final int d)?

来自分类Dev

为什么Java 8中的lambda不允许对匿名类不允许的成员变量进行前向引用?

来自分类Dev

为什么Java 8中的lambda不允许匿名类不允许成员变量的前向引用?

来自分类Dev

C ++:错误:不允许间接非虚拟基类

来自分类Dev

为什么方法中不允许使用静态本地类?

来自分类Dev

为什么不允许在返回IAsyncEnumerable的方法中返回IAsyncEnumerable

来自分类Dev

Java中不允许变量声明

来自分类Dev

为什么Clang不允许使用“和”作为函数名?

来自分类Dev

为什么在通用类型中不允许T类?

来自分类Dev

为什么ArrayDeque中不允许使用空值?

来自分类Dev

为什么jooq不允许whenNotMatchedInsert中的记录?

Related 相关文章

  1. 1

    为什么在函数中不允许“从...导入*”?

  2. 2

    为什么 \empty 和 \isset 在 php 中是不允许的

  3. 3

    为什么在Java中不允许这种向下转换?

  4. 4

    为什么Java 8的注释类型中不允许使用默认方法?

  5. 5

    为什么C ++中不允许int&a = <value>?

  6. 6

    在C ++不允许虚拟模板方法的情况下,C#如何允许虚拟通用方法?

  7. 7

    在C ++不允许虚拟模板方法的情况下,C#如何允许虚拟通用方法?

  8. 8

    为什么在Java中不允许赋值和不带括号的布尔运算符

  9. 9

    从构造函数分配Final变量| 不允许使用方法。为什么?

  10. 10

    从构造函数分配Final变量| 不允许使用方法。为什么?

  11. 11

    为什么Kotlin在主构造函数中不允许任何代码?

  12. 12

    matplotlib,为什么散点函数中不允许使用自定义标记样式

  13. 13

    为什么函数参数名称中不允许使用下划线?

  14. 14

    D为什么不允许嵌套函数重载?

  15. 15

    为什么不允许抽象构造函数?

  16. 16

    为什么Scala特性不允许构造函数参数?

  17. 17

    为什么不允许我提供函数参数?

  18. 18

    为什么不允许数字函数名称?

  19. 19

    为什么Java不允许在构造函数中初始化静态最终变量(例如static final int d)?

  20. 20

    为什么Java 8中的lambda不允许对匿名类不允许的成员变量进行前向引用?

  21. 21

    为什么Java 8中的lambda不允许匿名类不允许成员变量的前向引用?

  22. 22

    C ++:错误:不允许间接非虚拟基类

  23. 23

    为什么方法中不允许使用静态本地类?

  24. 24

    为什么不允许在返回IAsyncEnumerable的方法中返回IAsyncEnumerable

  25. 25

    Java中不允许变量声明

  26. 26

    为什么Clang不允许使用“和”作为函数名?

  27. 27

    为什么在通用类型中不允许T类?

  28. 28

    为什么ArrayDeque中不允许使用空值?

  29. 29

    为什么jooq不允许whenNotMatchedInsert中的记录?

热门标签

归档