• java与c++在虚函数方面的异同


    java与C++的虚函数比较java与C++的虚函数比较

    class base
    {
    private void print()
    {
    System.out.println(
    "base");
    }
    public void doprint()
    {
    print();
    }

    }

    class derive extends base
    {
    private void print()
    {
    System.out.println(
    "derive");
    }


    }

    class testVirtual
    {
    public static void main(String args[])
    {
    base b
    = new derive();
    b.doprint();
    }

    }
    运行结果:base
    因为父类的方法是private的,不能被子类的覆盖掉(java普通方法相当于C++的虚函数)
    base b=new derive(),内存匹配问题,就剩下父类的对象,所以b.doprint()访问的是父类的函数,如果该方法改成public,就会被子类覆盖掉

     

    我们有个一个类A,在构造函数中调用自己的方法f。

    现在有一个类B,继承A,并覆盖了方法f。

    那么构造函数B调用时先执行A的构造函数,此时在A的构造函数中的f是指A::f, 还是B::f呢?

    在C++中,对于函数调用的多态主要是通过虚表实现,在构造函数完成前,虚表未实现,所以此时不会有多态特性,故调用的仍然是A::f。

    但是在Java中表现则不是的,会调用到子类的方法,即B::f。

    在这一点上,C++的表现应该更加合理。

    故在Java中,若在构造时保证调用到的不会是派生类的方法,一定要调用private, 或final方法。因为final方法不会被覆盖,private也是,private默认其实就是final的,覆盖private方法其实是生成了一个新方法。

     


    c++例子

    class base
    {
    private:
    virtual void print()
    {
    printf(
    "base\n");
    }

    public:
    void doprint()
    {
    print();
    }
    virtual ~base(){}
    };

    class derived : public base
    {
    virtual void print()
    {
    printf(
    "derived\n");
    }
    };

    int main(int argc, char* argv[])
    {
    derived d;
    base& b = d;
    b.doprint();
    return 0;
    }

    运行结果:

    derived

      ----------------------------------------------------------------

    如果将上面JAVA中的private改为public, 则运行结果为derived 通过上面的例子, 应该可以看出C++与JAVA的虚函数异同点. 网上还有人把这二者的总结用下面的对比描述了一下:

      C++  --------   Java

    虚函数 -------- 普通函数

    纯虚函数 -------- 抽象函数

    抽象类 -------- 抽象类

    虚基类 -------- 接口

  • 相关阅读:
    将webcam设置为网站favicon
    IIS简单的反向代理设置
    在Heroku上免费部署ASP.NET Core(使用Docker和CircleCI)
    ModelBiner不验证某个属性
    大项目小细节---切换选项卡后的操作
    测试理论
    测试理论
    测试理论
    Chrome
    Docker
  • 原文地址:https://www.cnblogs.com/chester/p/2108011.html
Copyright © 2020-2023  润新知