《随笔十六》——C#中的 “ 虚函数 ”

目录使用基类的引用虚方法 和覆写方法覆写标记为override 的方法覆盖属性构造函数初始化语句使用基类的引用派生类的实例由基类的实例加上派生类新增的成员组成。 派生类的引用指向整个类对象,包括基类部分。如果有一个派生类对象, 就可以获取派生类对象的基类部分的引用。下面的代码示例 使用派生类对象的基类部分的引用来访问对象。namespace Hello...
摘要由CSDN通过智能技术生成

目录

使用基类的引用

虚方法 和覆写方法

覆写标记为override 的方法

覆盖属性

构造函数初始化语句


使用基类的引用


派生类的实例由基类的实例加上派生类新增的成员组成。  派生类的引用指向整个类对象,包括基类部分。

如果有一个派生类对象, 就可以获取派生类对象的基类部分的引用。

 下面的代码示例 使用派生类对象的基类部分的引用来访问对象。

namespace HelloWorld_Console
{
    class SomeClass
    {// 当基类中的字段是私有的,那么在派生类中定义同名字段, 该字段不需要添new,如果是其它的访问修饰符就需要添加new
    // 以上规则对基类中的成员函数都一样
        int m_Field = 0;
      public void Print()
        {
            WriteLine("调用的是基类中的Print函数!");
        }
        public SomeClass()
        {
            WriteLine("调用的是基类中构造函数!");
        }
        public void Show()
        {
            WriteLine($"输出基类的m_Field的值:{m_Field}");
        }
    }
    class OtherClass : SomeClass
    {
        new public void Print()
        {
            WriteLine("调用的是派生类的Print函数!");
        }
       public OtherClass()
        {
            WriteLine("调用的是派生类中构造函数!");
        }
      new  public void Show()
        {
            WriteLine($"输出派生类m_Field的值:{m_Field}");
            base.Show(); //派生类中调用基类中的该函数
        }
        int m_Field = 99;  
    }
    class Program
    {
        static void Main(string[] args)
        {
            OtherClass myOtherClass = new OtherClass();
            SomeClass mySomeClass = (SomeClass)myOtherClass;  //该代码不会调用基类的构造函数
            myOtherClass.Show();
            mySomeClass.Print();
            ReadKey();
        }
    }
}

输出结果为:

调用的是基类中构造函数!
调用的是派生类中构造函数!
输出派生类m_Field的值:99
输出基类的m_Field的值:0
调用的是基类中的Print函数!

当派生类中隐藏了基类中的成员, 使用基类对象引用派生类对象时, 然后用基类对象访问同名成员,访问的是基类中的同名成员。

 


虚方法 和覆写方法


   使用虚函数可以使基类对象引用派生类对象时, 然后用基类对象访问同名成员,访问的是派生类中的同名成员。

可以使用基类引用调用派生类的方法,只需要满足下面的条件:

  • 派生类中的方法和基类的方法有相同的签名和返回类型。
  • 基类的方法使用virtual标识。
  • 派生类的方法使用override 标识。
namespace HelloWorld_Console
{
    class SomeClass
    {// 当基类中的字段是私有的,那么在派生类中定义同名字段, 该字段不需要添new,如果是其它的访问修饰符就需要添加new
    // 以上规则对基类中的成员函数都一样
        int m_Field = 0;
        public SomeClass()
        {
            WriteLine("调用的是基类中构造函数!");
        }
       virtual public void Print()
        {
            WriteLine("调用的是基类中的Print函数!");
        }
        virtual public void Show()
        {
            WriteLine($"输出基类的m_Field的值:{m_Field}");
        }
    }
    class 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值