java继承与c++继承(Virtual)

java代码:

public class Father

{

    public void function()

        {

                System.out.println("father");

        }

}

public class Child extends Father

{

    public void function()

       {

               System.out.println("child");

       }

}

Father f = new Child();

f.function();调用的是哪个类的方法

c++代码:

class Father

{

public:

   virtual  void function()

    {

        count<<"Father"<<endl;

    }

   void A(){...}

}

class Child : public Father

{

public:

    void functino()

    {

          count<<"child"<<endl;

    }

    vodi A(){...}

}

Father *p = new Child();

p->function();

如果不加virtual 是调用的哪个类的方法,加了virtual调用的是哪个类的方法

 

根据java的多态性,调用的是Child类的function方法

c++不加virtual,调用的是Father类的function方法

加了virtual,调用的是child类的function方法

在java 中所有的方法都是虚拟函数

Child c;

Father *p = &c;

p->function();//子类方法

p->A();//父类方法

 

Child *c = &c;

c->function();//子类方法

c->A();//子类方法

 

p和c指向同一地址,按道理应该输出一样的答案,事实运行结果输出却不同。

这是因为决定p和c调用函数运行结果的不是他们指向的地址,而是他们的指针类型。“只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用”(C++ Primer 3rd Edition)。p是基类指针,c是派生类指针,c的所有函数调用都只是调用自己的函数,和多态性无关,所以c的所有函数调用的结果都输出Child;p的函数调用如果有virtual则根据多态性调用派生类的,如果没有virtual则是正常的静态函数调用,还是调用基类的,所以有virtual的f函数调用输出Chikd::,没有virtual则还是输出Father。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值