1  class program
 2     {
 3         static void main(string[] args)
 4         {
 5             //dog dog = new dog();
 6             pet dog = new dog("dd");//创建指向派生类dog的基类pet的实例
 7             //dog.name = "dd";
 8             dog.speak();//此处是调用pet类的虚方法speak(),根据dog所指向的派生类dog而调用dog里的同名重写方法speak()---即多态
 9             //cat cat = new cat();
10             pet cat = new cat("cc");//创建指向派生类cat的基类pet的实例
11             //cat.name = "cc";
12             cat.speak();//此处是调用pet类的虚方法speak(),根据cat所指向的派生类cat而调用cat里的同名重写方法speak()---即多态
13           
14 
15         }
16 
17     }
18     public class pet
19     {
20         public string name;
21         public void printname()
22         {
23             console.writeline("print"+name);
24         }
25         
26         virtual public void speak()//声明了virtual的方法就是虚方法,可在派生类中override重写
27         {
28             console.writeline("i'm "+name);  
29         }
30     }
31     public class dog : pet
32     {
33         public dog(string name)//构造函数
34         {
35             name = name;
36         }
37         new public void printname()
38         {
39             console.writeline("子打印"+name);
40         }
41         override public void speak()//重写基类pet的虚方法
42         {
43             console.writeline("子说" + name);
44         }
45     }
46     public class cat : pet
47     {
48         public cat(string name)//构造函数
49         {
50             name = name;
51         }
52         new public void printname()
53         {
54             console.writeline("子打印" + name);
55         }
56         override public void speak()//重写基类pet的虚方法
57         {
58             console.writeline("子说" + name);
59         }
60     }

 以上是虚方法和多态。

面向对象编程过程中尽量依赖抽象的类,而不要过分依赖具体类。

基类的引用可以指向派生类。通过指向dog类的pet类的引用,仅能访问dog中继承自pet的部分,如下:

class program
    {
        static void main(string[] args)
        {
            
            pet dog = new dog("dd");//创建指向派生类dog的基类pet的实例,前面的pet的位置 决定了下面引用的方法取自哪个类。
            dog.printname();
            pet cat = new cat("cc");//创建指向派生类cat的基类pet的实例
                         
           cat.printname();//指向派生类cat的对pet的引用,访问的是catl里继承自pet的方法---基类的引用

        }

    }
    public class pet
    {
        public string name;
        public void printname()
        {
            console.writeline("print"+name);
        }
             
    }
    public class dog : pet
    {
        public dog(string name)//构造函数
        {
            name = name;
        }
        new public void printname()
        {
            console.writeline("子打印"+name);
        }
      
    }
    public class cat : pet
    {
        public cat(string name)//构造函数
        {
            name = name;
        }
        new public void printname()
        {
            console.writeline("子打印" + name);
        }
       
    }