关于C#中关键字new override的使用(与C++对比)

俺是c#的新手,第一次接触,看到网上关于new/override资料学习了一下,记录下自己的体会

class Program

 {

    static void Main (string[] args)

    {

            baseClass bc;

            class1 ct1 = new class1();

            class2 ct2 = new class2();

              bc = ct2;

            bc.prinf();        

            bc = ct1;

            bc.prinf();

       bc.prinf();

    }

 }

 

public class baseClass

{

    private int index = 0;

    public virtual void prinf()

    {

        Console.WriteLine(""); //c#中用于换行

        Console.WriteLine("这是基类虚方法" + index.ToString());

    }

}

 

public class class1 : baseClass

{

    private int index = 1;

    public override void prinf()

    {

        Console.WriteLine("");

        Console.WriteLine("这是子类新的方法" + index.ToString());

     }

}

 

public class class2 : baseClass

{

    private int index = 2;

    public new void prinf()

    {

        Console.WriteLine("");

        Console.WriteLine("这是子类新的方法" + index.ToString());

   }

}

 

 

输出信息:

 

这是子类新方法1

 

这是基类新方法0

 

说明:

1.类名 对象名并不能创建对象,c#中要类名 对象名 = new 构造函数

2.C++不同,C#的对象赋值表示引用,只能子类对象赋值给基类,即使这样,基类也只能引用派生类中基类的部分,作为以上例子中的public new void prinf(),子类class2重写了函数prinf,也就是说函数的地址已经不再是原先基类的函数地址了,这样基类即使引用也只能是原先自己的printf函数,class1public override void prinf()使用的是override,表示将原先基类的printf方法重写,函数地址并没有发生改变,因此基类引用的将是重写后的函数。

3.只有基类是virtual,子类才能使用override

 

 

对比C++

class father

{

public:

        virtual void output()

       {

              cout<<"father output"<<endl;

       }

};

 

class child1:public father

{

public:

       void output()

       {

              cout<<"child1 output"<<endl;

       }

};

 

class child2:public father

{

public:

       void output()

       {

              cout<<"child2 output"<<endl;

       }

       void childfun()

       {

              cout<<"child2 childfun call"<<endl;

       }

};

 

void fun(father *p)

{

       p->output();

}

 

void main(void)

{

       father fa;

       child2 ch;

       fa = ch;

       fa.output();

 

       father fath = ch;

       ch.output();

     

       father *p = &ch;

       fun(p);

       p->childfun(); //错误,C#的多态原理相同,作为父类的指针p只能指向子类继承父类的函数,

       p->output();   //由于多态性的原理,将输出子类重写后的函数 child2 output

       ch.childfun();

 

       father *p = &ch;

       fun(p);

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值