C#中父类转换成子类之后为什么不具备子类的属性和方法了

笔者是新手,已经在学习面向对象了,可是有一个疑问一直想不通:根据里氏转换原则,父类对象如果里面存储的是一个子类对象,那么这个父类对象是能够强转成子类的。可是根据本人的理解,父类对象强转成子类之后应该就是一个子类对象吧,为什么不具备子类的属性和方法呢。
下面是具体案例:
比如我定义了一个父类对象Person:
Class Person
{
private string name; //定义person类的姓名字段和属性
public string Name
{
get{return name;}
set{name=value;}
}

private char sex; //定义Person类的性别字段和属性
public char Sex
{
get{return sex;}
set{sex=value;}
}

public void PersonSayHello()
{
Console.WriteLine("我是一个人类!");
}
}

然后我又定义了一个Person类的子类Student:
class Student:Person //继承于Person类
{
private int mathscore; //定义一个数学分数属性
public int MathScore
{
get{return mathscore;}
set{mathscore=value;}
}

public void StuSayHello()
{
Console.WriteLine("我是一个学生。");
}
}

然后我实际代码如下:
Person PER=new Student(); //创建一个Student对象,将其赋值给Person对象PER
Student STU=(Student)PER; //根据里氏转换原则,将PER对象转换成Student类型,并赋值给STU。

接下来就是问题了,我特意使用PER的GetType()方法试了转换之后PER确实是Student类型,但是我不能为PER的mathscore属性赋值,也不能调用PER作为一个Student对象的StuSayHello()方法,这是为什么呢。

6个回答

你好,Person PER=new Student();
Student STU=(Student)PER;
首先这是多态,这两段代码是没有问题的,但是PER.mathscore=5;Per.StuSayHello()是不合法的,因为mathscore和StuSayHello()是子类的扩展属性和方法,在父类里面没有,子类没有重写父类里面任何方法,Person PER=new Student();这段代码虽然是父类引用指向子类对象,但是只有子类重写了父类的方法后,Per.StuSayHello()这样调用才会执行子类重写后的StuSayHello()方法。总结一下:多态的弊端,不能使用子类提油的功能,因为子类特有方法不是重写的,如果在多态情况下想使用子类特有的方法,应该向下转型。至于为什么PER.mathscore=5;是错误的,是因为父类中没有这个属性,你使用父类引用去访问这个成员会显示找不到符号等错误。再总结一下:多态的前提:A:有继承 B:有实现 C:有方法重写 D:有父类引用指向子类对象。多态中成员访问特点:A:访问成员变量:编译看左边,运行看左边。
B:访问成员方法:编译看左边:运行看右边。(如果子类有方法重写,就使用子类重写过的方法;父类引用不能使用子类特有的方法)

qq_36442947
睡着了才觉得冷 特有,打错了
2 年多之前 回复
qq_36442947
睡着了才觉得冷 补充一点:我说的重写父类里面的方法:”Per.StuSayHello()这样调用才会执行子类重写后的StuSayHello()方法。“,必须你现在这个Person类要有这个方法,实际上你可以重写PersonSayHello()
2 年多之前 回复

Student STU=(Student)PER;
STU.xxx
只能这么调用
PER是基类类型,编译器只认类型,而不是实际的对象。
道理很简单,PER是一个变量,它可以是student类型,也可以不是,运行的时刻,它是什么类型,谁也不知道,编译器只能按照person对待。

PER 和 STU虽然指向的是同意对象,但是 PER会认为对象内容是一个Person ,所以只能调用Person类的方法

代码问题,代码如下:
Person PER=new Student();
Student *STU=(Student
)PER;
STU->StuSayHello();

xzs1994
xzs1994 new 对象返回的是指针
2 年多之前 回复
l19920312
l19920312 PER 和 STU虽然指向的是同意对象,但是 PER会认为对象内容是一个Person ,所以只能调用Person类的方法这个说法是对的
2 年多之前 回复
qq_39664442
qq_39664442 ddf
2 年多之前 回复
qq_15643973
qq_15643973 回复qq_15643973: new 对象返回的是指针
2 年多之前 回复
qq_15643973
qq_15643973 指针打不出来,什么鬼?
2 年多之前 回复

new 对象返回的是指针

正常就是这样的,不然子类=父类,就没有区别了图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐