| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 603 人关注过本帖, 1 人收藏
标题:多态和和继承
只看楼主 加入收藏
czg123698741
Rank: 2
等 级:论坛游民
帖 子:348
专家分:84
注 册:2009-3-4
结帖率:78.99%
收藏(1)
已结贴  问题点数:1 回复次数:6 
多态和和继承
大家好,请问一下~~~~~~
代码:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication10
{
    class MyClass1
    {
        private int x = 0;
        private int y = 0;

        public int X
        {
            set { x = value; }
            get { return x; }
        }
        public int Y
        {
            set { y = value; }
            get { return y; }
        }

        public virtual int add()
        {
            return X + Y;
        }
    }

    class MyClass2:MyClass1
    {
        public override int add()
        {
            int x = 5;
            int y = 7;
            return x + y;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass2 myclass2 = new MyClass2();
            MyClass1 myclass1 = (MyClass1)myclass2; //<1>使用派生类MyClass2的对象实例化基类MyClass1的对象
            MyClass1 myclass1 = new MyClass1();     //<2>使用MyClass1实例化
            myclass1.X = 3;
            myclass1.Y = 5;
            Console.WriteLine(myclass2.add());
            Console.WriteLine(myclass1.add());
            Console.ReadLine();
        }
    }
}

结果(<1>和<2>分别有两种情况):
<1>——12 , 12
<2>——12 , 8

问题:
为什么会有两种不同的结果呢????????请帮帮忙,谢谢~~~~~~~~~~~~
可以详细解释一下第一种情况吗???这种用基类来实例化比较少见~~~~~~~~
搜索更多相关主题的帖子: 多态 继承 
2009-10-25 00:11
风云II
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-10-18
收藏
得分:0 
回复 楼主 czg123698741
首先这是一个类中的虚方法函数
第一种情况是class1调用方法add( ) 实际调用了class2中的add(),这是因为编译时值为class1,但运行时值
为class2 ,所以class2 完成了对方法的实际调用。
第二种情况是class1通过实例化后直接调用自己的函数add()
2009-10-25 08:51
czg123698741
Rank: 2
等 级:论坛游民
帖 子:348
专家分:84
注 册:2009-3-4
收藏
得分:0 

我还是不怎么动啊!
可不可以在解释一下啊。
MyClass1 myclass1 = (MyClass1)myclass2;
我当初想是可能是使用派生类对象myclass2将MyClass1转换为基类。
但是似乎有点不对劲啊
~~~~~~~~~~~~~~~~~~~~
2009-10-30 17:13
moridiansha
Rank: 6Rank: 6
来 自:承德
等 级:侠之大者
威 望:4
帖 子:254
专家分:417
注 册:2009-10-21
收藏
得分:0 
看得我头有点晕

www.qysy.tk
2009-10-31 11:21
baikil
Rank: 10Rank: 10Rank: 10
来 自:X星球
等 级:青峰侠
威 望:4
帖 子:282
专家分:1580
注 册:2009-7-20
收藏
得分:0 
MyClass1 myclass1 = (MyClass1)myclass2;
myclass2为MyClass2的实例对象,public override int add(),重写了MyClass1中的add()方法,myclass2.add() 为重写后的.对myclass2的一个强行转换为基类类型,这样只对派生类(MyClass1)保留重写的方法,对新定义的屏蔽。 所以会出现myclass1.add()为重写后的方法。

自创QQ群64885635,方便C#学习交流.希望各项工作路好学都好入!
2009-10-31 14:04
zregren
Rank: 1
等 级:新手上路
帖 子:6
专家分:9
注 册:2009-9-21
收藏
得分:0 
这个在《你必须知道的.NET》有详解,你写的第1种实际是告诉编译器,你要从CLASS2开始寻找ADD()方法,如果有就调用CLASS2的,如果没有就调用class1的,这种机制叫就近原则;
2009-11-01 10:24
zregren
Rank: 1
等 级:新手上路
帖 子:6
专家分:9
注 册:2009-9-21
收藏
得分:0 
并且你的第1个类的ADD()方法是个虚函数(编译器就会启用延迟绑定技术),他实际告诉编译器,优先实现子类方法,没有在用基类;
MyClass2 myclass2 = new MyClass2();
MyClass1 myclass1 = (MyClass1)myclass2;
你可以看成MyClass1 myclass1 = new MyClass2();这句话就是说我允许myclass1调用CLASS1和CLASS2(需要对继承的内存模型有了解)
2009-11-01 10:34
快速回复:多态和和继承
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016674 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved