换个例子:
Form1类  继承自Form类平时这样用:
Form1 frm1= new Form1();你想这样用:
Form frm1= new Form1();如果这样用
Form frm = new Form();
和Form1还有什么关系?

解决方案 »

  1.   

    也不能说一点意义都没有!!
    楼主这样做,虽然不能访问到B类的公共方法,
    但A a = new B(); 这样创建实例,
    首先会执行到B类中得成员变量,也会执行到B类的构造函数(如果有的话),
    也许有这种需要,只要执行某个类的成员变量和构造函数,
    所以还是有意义的!!
      

  2.   

    确实没意义...但“直接用A a = new A();”是不行的,区别很大...A a = new B(); 和 B b = new B(); 几乎是等效的...说几乎是因为他们还是有一点点区别的...因为前者a是声明为A类型,所以a的引用类型元数据只是类型A的元数据,但它的实例类型却是不折不扣的B类型,也就是说a对象实例实际上具有类型B的元数据...而b对象从引用类型到实例类型都是B类型,就b对象实例本身而言和前者没有区别...而“直接用A a = new A();”,则a从引用类型到实例都是A类型,和B没有任何关系...这样用的目的是教学,告诉你继承的一个特性——派生类可以隐式转换为基类...
    A a = new B();//相当于A a;
    B b = new B();
    a = b;
    反过来...基类不可以转换为派生类,隐式显式都不行,所以“直接用A a = new A();”就是另一个概念了...实际应用中这样的用法是没什么意义的...也许有人觉得有时这样用清楚一些,比如...
    A a = new B();
    func(a);void func(A a){}但它其实和下面这段没有不同,一样清楚...
    B b = new B();
    func(b);void func(A a){}
      

  3.   

    这样做是可以 的,前提是有继承关系,这样做目的是,多个子类共同继承A,(这时A有点像抽象类《或者就是抽象类》或接口),多个子类有共同的属性和方法,方便使用(如类工厂的使用),如果需要使用b类特有的功能时,使用 as B 或强制转换 ,就可以使用b的方法属性了。http://www.mybuffet.cn
      

  4.   

    怎么能说没意义
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication4
    {
        class Program
        {
            static void Main(string[] args)
            {
                A X;
                X = new A();
                Print(X);
                X = new B();
                Print(X);
                Console.Read();
            }        class A
            {
                public A()
                {
                    Console.WriteLine("A");
                }
            }        class B:A
            {
                public B()
                {
                    Console.WriteLine("B");
                }
            }        static void Print(A X)
            {
                if (X is B)
                    Console.WriteLine("Print B");
                else
                    Console.WriteLine("Print A");
            }
        }
    }
      

  5.   

    和接口类似,可以起到一个通用形参的作用,还有其他的用处
    你看C#里的参数不就是么
    Object sendersender可以是任何从Object继承的
      

  6.   

    还可以用于反射
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication4
    {
        class Program
        {
            static void Main(string[] args)
            {
                A X;
                X = CreateClass(typeof(A));
                X = CreateClass(typeof(B));
                Console.Read();
            }        class A
            {
                public A()
                {
                    Console.WriteLine("A");
                }
            }        class B : A
            {
                public B()
                {
                    Console.WriteLine("B");
                }
            }        static A CreateClass(Type T)
            {
                if (T==typeof(B))
                    return new B();
                else
                    return new A();
            }
        }
    }
      

  7.   

    第一种写法有多态的味道在里面,如果A里面的方法在B里面被override了,那么a.Method()将是B里面的方法。而非是A里面的方法
      

  8.   

    这是向上转型 从子类转向父类 反过来就是向下转型
       如果父类是抽象类那就不能new 只能通过子类间接new
    不过这时子类的方法和属性将会被父类覆盖掉
     这是一种简单的多态
    多态有四种:
    1.强制多态
    2.重载多态 (1和2又叫伪多态)
    3.参数化多态
    4.重写多态(3和4又叫曾多态)
      

  9.   

    基类引用在调用 virtual, abstract 函数时的行为.
      

  10.   

    virtual! virtual! 
      

  11.   

    如果B中有A中重写的成员函数,还可以调用B中重写的函数。
    这样做是为了实现多态性,只是你的太简单了,没显示出来罢了