俺是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函数,而class1的public 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);
}