首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • java的多态 vs c++的多态 [无满意答案结帖,结帖人:wilcos]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wilcos
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-20 13:02:13 楼主
    我们知道,多态是OO中很重要的一个概念,在面向对象的语言中,都有对它的支持。但在不同语言中,对它的实现是不一样的。
    在java中,动态绑定是java默认的行为,除非你将方法声明为static和final方法。
    在c++中,动态绑定不是c++的默认认为。要触发动态绑定,必须将方法声明为虚函数。

    在c++中,有覆盖虚函数机制。也就是说,派生类虚函数可以调用基类的版本。如下:
    #include <iostream>;
    using namespace std;

    class person {
        public:
        person() {
        }

        virtual void run() {
            cout < <"person running" < <endl;
        }
    };

    class man : public person {
        public:
        man() {
        }

        void run() {
            cout < <"man running" < <endl;
        }
    };

    int main() {
        person *p = new man();
        p->person::run();
        system("pause");
        return 0;
    }
    通过使用作用域名操作符::, 将强制调用基类中run()方法,而不是派生类中run()方法。

    问题来了,java中有这样的支持吗?能强制调用基类中的方法吗?大家可以看看这个代码
    class baseClass {
        void run() {
            System.out.println("run function in base class is called");
        }
    }

    public class extendClass extends baseClass {
        void run() {
            System.out.println("run function in extend class is called");
        }

        public static void main(String[] args) {
            baseClass a[] = {new baseClass(), new extendClass()};
            for (int i = 0; i < a.length; i++) {
                a[i].run();
            }
        }
    }
    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • YidingHe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:00:561楼 得分:0
    当父类的方法被子类覆写后,外部就不应该从子类的对象去直接调用父类的方法了。这是 Java 的世界观。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zy353748272
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 00:39:162楼 得分:0
    当子类覆盖父类的方法时,就代表父类的此方法已过时(不在需要),所以可由子类提供该项服务时,不需要
    考虑由父类来提供
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shlgsty
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 01:04:103楼 得分:0
    引用 2 楼 zy353748272 的回复:
    当子类覆盖父类的方法时,就代表父类的此方法已过时(不在需要),所以可由子类提供该项服务时,不需要
    考虑由父类来提供

    我对楼上注解:

    你可以这么想像你作为儿子去要你父亲的钱,你父亲把钱给你花,原来钱就从你父亲哪里到你那里去了!!

    这样你就可以去消费了(提供服务)!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hmsuccess
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:56:374楼 得分:0
    c++的动态绑定是由虚函数表来体现的,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • foundercy_weng
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 10:07:135楼 得分:0
    java 本来就是c++基础上进一步开发的,肯定支持!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • foundercy_weng
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 10:07:276楼 得分:0
    java 本来就是c++基础上进一步开发的,肯定支持!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • acrobatyuer
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 10:37:087楼 得分:0
    再具体一点说,因为他们的创作人不同,所以观点不同。而且每个人对OOP都有不同的看法的呀!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yewei2008
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 12:48:388楼 得分:0
    引用 1 楼 YidingHe 的回复:
    当父类的方法被子类覆写后,外部就不应该从子类的对象去直接调用父类的方法了。这是 Java 的世界观。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • healer_kx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:17:189楼 得分:0
    没有说到本质和主要区别啊。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wilcos
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-26 19:21:4410楼 得分:0
    同意YidingHe的说法,java不支持这样的操作,
    同意java支持这样操作的朋友,如foundercy_weng,能够写出示例代码吗?谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZjJ_Sir
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-27 03:22:1411楼 得分:0
    C++ 的多态性是由虚函数和基类指针实现的,而Java的多态是由基类变量实现的,基类变量引用基类对象,则这个积累变量调用的函数为基类的,如引用派生类的对象,则调用的函数为派生类的。还有就是,基类与派生类中有同样的函数时,叫做,函数重置。函数重载就不用说了吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zishizhilong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-27 07:49:5212楼 得分:0
    引用 2 楼 zy353748272 的回复:
    当子类覆盖父类的方法时,就代表父类的此方法已过时(不在需要),所以可由子类提供该项服务时,不需要
    考虑由父类来提供
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beiouwolf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-27 09:48:1513楼 得分:0
    多态对于语言无关...
    多态的概念都一样
    JAVA内建了虚函数表,他所有的方法都是virtual的
    所以只要方法签名相同,子类的方法就会被认为是覆盖方法

    JAVA效率比C低的一大原因就是内建的虚函数表
    C在不使用virtual关键字的情况,执行效率比较高
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beiouwolf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-27 09:50:3014楼 得分:0
    还有你说的强制调用基类的函数做法
    这不是已经破坏多态基础概念了
    从多态角度来说不应该这么做
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wilcos
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-27 23:09:3415楼 得分:0
    引用 14 楼 beiouwolf 的回复:
    还有你说的强制调用基类的函数做法
    这不是已经破坏多态基础概念了
    从多态角度来说不应该这么做


    我想知道能不能?至于这样做是不是破坏了多态,不是我想的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZangXT
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-08-27 23:14:5916楼 得分:0
    java没有强制调用的方法.
    你可以让子类提供其他的方法,这个方法除了调用你要使用的父类方法之外什么都不作.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maquan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 00:18:2417楼 得分:0
    引用 15 楼 wilcos 的回复:
    引用 14 楼 beiouwolf 的回复:
    还有你说的强制调用基类的函数做法
    这不是已经破坏多态基础概念了
    从多态角度来说不应该这么做


    我想知道能不能?至于这样做是不是破坏了多态,不是我想的

    如果是从外部显式调用父类的代码,确实是有违多态的初衷;但从子类内部应该可以调用父类的代码,这并不破坏什么,而正是“代码重用”的体现。

    还好,Java 碰巧就是这么实现的 :)
    Java code
    public class TestOverride { static public void main( String[] args ) { Base o = new Derived(); o.doSomething(); } } class Base { public void doSomething() { System.out.println("here is Base.doSomething()"); } } class Derived extends Base { public void doSomething() { System.out.println("here is Derived.doSomething()"); super.doSomething(); // 请注意这里! } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • peiqu123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 00:32:2818楼 得分:0
    17楼是正确的。要可以使用SUPER来调用基类的被覆盖的函数、、、
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beiouwolf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 09:01:2719楼 得分:0
    没错啊
    从内部对基类的访问是符合多态的
    但是从外部访问就不是了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wilcos
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 14:50:5820楼 得分:0
    引用 17 楼 maquan 的回复:
    引用 15 楼 wilcos 的回复:
    引用 14 楼 beiouwolf 的回复:
    还有你说的强制调用基类的函数做法
    这不是已经破坏多态基础概念了
    从多态角度来说不应该这么做


    我想知道能不能?至于这样做是不是破坏了多态,不是我想的

    如果是从外部显式调用父类的代码,确实是有违多态的初衷;但从子类内部应该可以调用父类的代码,这并不破坏什么,而正是“代码重用”的体现。

    还好,Java 碰巧就是这么实现的 :)
    Java codepubliccl…


    通过super,只能在类内部调用,不是通过外部实例。看来通过外部实例,在java中是无法调用被子类覆盖的父类代码,c++却可以做到。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ilysony
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 14:55:1521楼 得分:0
    late binding
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wilcos
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-03 10:53:1022楼 得分:0
    还有朋友回答吗?这个问题感觉还是没有搞定
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qiandongbo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-03 14:08:4423楼 得分:0
    <code>
    class Animal{
    public String toString()
    {
    return this.getClass().getName();
    }
    public void eat()
    {
    System.out.println("Animal");
    }
    }
    class Dog extends Animal
    {
    public void eat()
    {
    System.out.println("Dog");
    }
    public void superEat()
    {
    System.out.println("super Dog eat");
    super.eat();
    }
    }
    class Tiger extends Animal
    {
    public void eat()
    {
    System.out.println("Tiger");
    }
    public void superEat()
    {
    super.eat();
    }
    }
    class Monkey extends Animal
    {
    public void eat()
    {
    System.out.println("Monkey");
    }
    }
    public class qdb
    {

    private static void factory(Dog dog)
    {
    //dog.eat();
    dog.superEat();
    }
    private static void factory(Tiger tiger)
    {
    tiger.eat();
    }
    private static void factory(Animal animal)
    {
    animal.eat();
    }
    public static void main(String[] args)
    {
    factory(new Tiger());
    factory(new Dog());
    factory(new Monkey());
    factory(new Animal());
    }
    }
    </code>
    利用多态模拟出来的,不过一般谁会无聊这么用法啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qiandongbo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-04 13:18:1224楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qiandongbo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-04 13:18:4525楼 得分:0
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved