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

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

new 对象返回的是指针

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c#中 父类调用子类的属性、方法
  我们习惯认为,子类对父类是不可见的,或者说父类不知道子类的存在,所以父类是调用不到子类的方法、属性的,以下这种方式,可以实现父类调用子类属性、方法的功能,欢迎拍砖。。。   public class WeChatBaseController  //父类 { public WeChatBaseController() { } public string MyUserList ...
为什么子类无法使用父类的方法和属性?
[code=C#]rn//基类rnpublic class BasePage : System.Web.UI.Pagernrn public BasePage()rn rn //rn // TODO: 在此处添加构造函数逻辑rn //rn rn private int userID;rn /// rn /// 用户IDrn /// rn public int UserIDrn rn get return userID; rn set userID = value; rn rnrn private string userName;rn /// rn /// 用户名rn /// rn public string UserNamern rn get return userName; rn set userName = value; rn rnrn private int userType;rn /// rn /// 用户类型rn /// rn public int UserTypern rn get return userType; rn set userType = value; rn rnrn rn public void SetUserCookie()rn rn UserID = Convert.ToInt32(Request.Cookies["UserID"].Value);rn UserName = Request.Cookies["UserName"].Value;rn UserType = Convert.ToInt32(Request.Cookies["UserType"].Value);rn rnrn[/code]rnrn[code=C#]rn//继承BasePagernpublic class BaseCompany:BasePagernrn public BaseCompany()rn rn //rn // TODO: 在此处添加构造函数逻辑rn //rn rn //BasePage bp = new BasePage();rn rnrn[/code]rn为什么BaseCompany里无法使用SetUserCookie,和一些属性是不是要用this. 可是this也点不出来相关属性和方法?
父类转换成子类的问题
有什么方法能快速把父类转换成子类呢?rnrn如果一个类里面有几百个成员的话,不就要每一个成员一行代码!? 太慢了吧rnstruct fatherrnrn father() ;rn father( int p )rn rn b = p;rn rnprotected:rn int b;rn;rnrnstruct son : public fatherrnrn int c;rn;rnrnvoid main()rnrn father f( 10 );rn son s = (son)f;rn
子类重写父类属性
1、子类重写父类的属性,编译器不会合成带下划线的属性,需要自己手动合成setter和getter,否则这个属性将由父类实现,也就是说如果子类没有手写set和get方法,声明的@property相当于没写 2、在 oc 中属性就是给一个类的成员变量提供封装: Objective-C properties offer a way to define the i...
子类属性覆盖父类
java 三大属性封装,继承,多态如果对于一般的方法的覆盖,大家一般都可以判断出来但是对于子类的属性覆盖,还是需要时间分析class A { int a = 100; void f() { System.out.println(a); } } class B extends A { int a = 9999; void f() { ...
在父类获取子类属性
NULL 博文链接:https://2528.iteye.com/blog/1523901
子类静态属性、子类属性赋值、子类构造函数、子类构造代码块、子类静态代码块、父类静态属性、父类构造函数、父类构造代码块、父类静态代码块执行顺序
先看父类构造方法、子类构造方法、子类属性赋值 class Father { public Father() { System.out.println("父类构造方法"); show(); } public void show() { System.out.println("父类show"); } } class Son extends Father { int num =...
子类调用父类的方法
今天在看某项目源代码时,我看到了这样的代码 class B{ public: void printB(){ A::PrintA(); } }; 看了这个代码,我以为printA是类A的static方法,结果找了半天没找到,很尴尬。。。原来子类调用父类就是这样调用的。 所有代码如下: class A{ public: void printA(){}...
子类调用父类方法
public class MainActivity extends FatherActivity { TextView tv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont...
子类调父类方法
window.parent.addTab('子明细',url);
子类父类方法问题
先上代码吧rn[code=C/C++]rnclass testrnrnpublic:rn virtual void my()cout << "test"<
子类屏蔽父类的方法
需求: 假设已经有鸟类的定义,现在我们定义鸵鸟继承了鸟类的属性。但是鸟类有会飞的方法,鸵鸟是不会飞的。那么鸵鸟类中应该如何屏蔽鸟类中会飞的方法呢?# -*- coding: utf-8 -*-class Bird: def fly(self): print("I belive I can fly!")class Ostrich(Bird): def fly(self
父类和子类的方法
定义两个类Person,Student. Student是Person的子类rnStudent中有一个方法 void geta();rnrnPerson p=new Person();rnrn为什么这样可以: (Student)p.geta();rnrnrnrn而这样不可以? :rnp=(Student)p;rnp.geta();
关于子类和父类中的方法
请问在子类中是否允许有一个类的方法和父类的方法名字相同而类型不同?rnrn我只知道在c++中不允许。rnrn另外,如果可以,那调用的时候怎样区分?rnrn谢谢
子类中重载父类方法
本课程从零开始讲解了PHP面向对象的知识,是学习PHP面向对象的佳教程
父类调用子类方法
请问,如果父类有一个空的方法,有个子类实现了这个方法,那在用这个父类对象调用此方法的时候,是不是会默认调用其子类的这个方法呢?rn参考代码如下:rnpublic class baseLayout extends LinearLayoutrnrn ... ...rn public void onUpdate() rn ... ...rnrnpublic class derivedLayout extends imiLinearLayoutrnrn ... ...rn public void onUpdate() rn mAdapter.notifyDataSetChanged();//[color=#008000]实现了父类的onUpdate方法[/color]rn rn ... ...rnrnprivate baseLayout mBaseView;//[color=#008000]现在有个imiLinearLayout(父类)对象[/color]rnprivate derivedLayout mDerivedView;//[color=#008000]现在有个BuddyLinearLayout(子类)对象[/color]rnmBaseView = (baseLayout)mDerivedView;rn... ...rnmBaseView.onUpdate();//[color=#008000]调用此父类对象的onUpdate方法[/color]rn系统是不是会默认调用其子类derivedLayout 的onUpdate方法呢?
子类覆盖父类中的方法
本课程是继php系列课程基础知识入门篇,主要讲解的知识点有,面向对象的有关知识,包含,类的详解,构造函数,析构函数,接口,抽象,静态类,继承,多态,封装,并结合当前主流的框架(thinkphp,yii,Lavarel 等框架)进行讲解。
继承、访问控制符、子类重载父类的方法、子类调用父类的方法
继承继承性也是面向对象程序设计中的重要特性之一,在面向对象领域有着极其重要的角色,它是指建立一个新的派生类,从先前定义的类中继承数据和函数,而且可以重新定或加进新的数据和函数,从而建立了类的层次或等级关系。但在php中只能使用单继承,就是说一个类只能直接从另一个类中继承数据,但是一个类可以有多个子类。在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性。这是信息组织与分类的行之有效的方法。它简
C#中子类与父类的相互转换
1.父类不能直接强制转换成子类 2.子类可以强制转换成父类,但是在父类中只能取父类的字段与方法因此在一个父类对应多个子类的时候,不知道具体是哪个子类的时候,就可以先声明一个父类的类型。(如例1) 3.由1,2知,父类不能直接强制转换成子类,但是可以通过间接的方法进行转换,例1中有所体现:将子类转换成父类,然后再把父类转换成子类,如例2。 特别说明:虽然可以通过间接方式将父类转成子类,但实际用处
C# 父类与子类的简单使用
protected  子类可以访问父类 Random  r=new Random( ); int rand=r.Next(1,45);   // 产生在1--44之间的随机数 namespace convert {     class Program     {         static void Main(string[] args)         {
C# 父类与子类
大家好,我是C#的初学者。rn请问通过父类引用子类,从而来使用子类override方法,有什么实际用处。rn(不通过父类引用子类,而直接通过子类的对象来调用该方法不是也可以实现吗?为什么要这么麻烦呢)rnrn谢谢大家。
为什么强迫父类转换成子类会出错!
package chapter3;rnrnpublic class A rn public A() rn rnrn public static void main(String argv[])rn rnrn A a1 = new A();rn B b1 = new B();rn rn b1=(B)a1;rnrn rnrnrnpackage chapter3;rnrnpublic class B extends Arn public B() rn rnrnrn
子类如何强制转换成父类??
类User rn类UserInfo : UserrnrnUser user=new User();rnuser=userInfo;rnrn调试的时候 rnuser.GetType() 还是UserInfo类rnrn如何能让user.GetType()返回user类呢?rnrn谢谢!rn
子类转换成父类方法不丢失么?
最近在淘宝上花了15元大洋买了本java编程思想,对其中的转换很不理解。rnrn子类继承了父类,那么子类也扩展了一些父类所没有的方法。当子类转换成父类的时候,一些方法应该丢失了啊。为什么还能转换回来呢?rnrn例如Object类,它只有那么多方法。而ArrayList类则是继承了Object类。rnrnArrayList a = new ArrayList();rn ...rnObject obj = (Object)a; rnrn当转换成obj的时候,a的一些ArrayList方法应该都没有了啊。rnrn为什么转回来之后,例如ArrayList b=(ArrayList)obj;rnrnb没有丢失任何方法?rnrn谢谢大家咯~
java 用户自定义的父类转换成子类的方法
在工作中,一般是实体类对应的数据库表,另外再定义一个Model继承实体类,在model里往往添加一些辅助的属性。我们从数据库查出的数据放在实体类里,但是展现数据时需要用到model类,这时就需要把实体类转换成Model类。父类不可能强制转换成子类,所以写了一个通用的方法,适用于这种场景下的转换,代码如下: /** * 通过public的 get set方法进行复制,适合用于父类
父类如何强制转换成子类?
1、我的页面中有一个TreeView:tvEquip rn2、类MyTreeNode继承自类TreeNode,MyTreeNode中增加了一些自定义属性,比如string NodeType等: rnpublic class MyTreeNode:TreeNode rn rn protected string _nodeType = ""; rn public string nodeType rn rn get return _nodeType; rn set _nodeType = value; rn rnrn protected object _Obj = ""; rn public object Obj rn rn get return _Obj; rn set _Obj = value; rn rnrn public MyTreeNode() rn rn // TODO: 在此处添加构造函数逻辑 rn rn rnrn3、在页面的Page_Load事件中: rnprotected void Page_Load(object sender, EventArgs e) rn rn //生成root节点 rn if (!IsPostBack) rn rn MyTreeNode iNode = new MyTreeNode(); rn iNode.Value = "X"; rn iNode.Text = "项目"; rn iNode.nodeType = "PROJECT"; rn rn tvEquip.Nodes.Add(iNode); rnrn iNode = new MyTreeNode(); rn iNode.Value = "Y"; rn iNode.Text = "区域"; rn iNode.nodeType = "AREA"; rn rn tvEquip.Nodes.Add(iNode); rnrn rn rnrn4、TreeView:tvEquip的TreeNodePopulate事件中: rnprotected void TvEquip_TreeNodePopulate(object sender, TreeNodeEventArgs e) rn rn MyTreeNode pNode = (MyTreeNode)e.Node; rn switch (pNode.nodeType) rn rn case "PROJECT": rn rn PopulateX(pNode); rn break; rn rn case "AREA": rn rn Populatey(pNode); rn break; rn rn rn rnrn在TvEquip_TreeNodePopulate(object sender, TreeNodeEventArgs e)的事件中 rnMyTreeNode pNode = (MyTreeNode)e.Node;报错:无法将类型为“System.Web.UI.WebControls.TreeNode”的对象强制转换为类型“MyTreeNode”。 rn另外在Page_Load事件中,跟踪tvEquip,发现tvEquip的节点都是MyTreeNode类型的,但到了TvEquip_TreeNodePopulate中再跟踪tvEquip,发现它的节点都变成TreeNode类型了。rnrn需要说明的是:在TvEquip_TreeNodePopulate的事件中,e.Node是系统通过参数传过来的值,它的类型我无法改变。在构建treeview的时候,节点对象全部是MyTreeNode(一些属性也在MyTreeNode的属性中)。现实情况我也希望用MyTreeNode获取父节点的所有属性,但在事件中只能获取节点类型是TreeNode的节点对象。哪位高手能告诉我怎么做?谢谢!
如何把父类转换成子类?
JAVA中父类是不能强行转换成子类的,这个我清楚?但是最近在做一个项目时,遇到这种情况,我需要把父类的对象强行转换成子类的?请问各位大侠有什么好的解决办法没?rn假如下面的例子:rnClass ArnClass B extends Arn private String name;rn void setName(String n)...;rn String getName()...;rnrn public class C rn rn public static void main(String[] args) rn rn System.out.println("强制类型转换A->B后的调用效果:"); rn A a = new A(); rn B b = B(a); //编译通过,但是运行出错rn b.setName("test");rn System.out.println(b.getName());rn rnrn我的目的就是达到上面理想状态中的效果.rn
C# 里氏转换(父类转换成子类)( is as )
里氏转换: 1、子类可以赋值给父类 2、如果父类中装的是子类对象,则可以将这个父类转换为对应的子类对象 ---->关键字 1、is:返回bool类型,指示是否可以做这个转换 2、as:如果转换成功,则返回对象,否则返回null using System; using System.Collections.Generic; using System.Linq; using Sys
父类构造方法、父类静态方法、父类一般方法、子类构造方法、子类静态方法、子类一般方法调用顺序
调用顺序为:父类静态方法、  子类静态方法、父类构造方法、子类构造方法、一般方法谁先调用,谁先执行;                              测试代码:                                                   public class TestStatic {                                   
在继承中子类如何将父类的属性在子类中改名和屏蔽
在继承中子类如何将父类的属性改名和屏蔽rn如Parent有属性a,brnrn子类Child:Parent,Child继承于Parent,当然有属性a,brnrn,现在我要做的事情是在Child中,rn1、不要b 了rn2、要a但想改为另外一个名字AA.rnrn也就是实例化时rnChild c = new Child();rnc.AA =...,但看不到brn
父类与子类
这个份博客的起因 A b = new B (); ,这里的b并不是A的实例,而是B的实例。 如何理解 B c = new B(); A a = c; A是B的父类 当构造函数相同时,优先编译父类如: 但子类有override修饰时,c就可以调用 刚接触:重写,重载,隐藏不太了解 慢慢理解 public abstract class A { public A() ...
父类子类
[code=C/C++]rnclass T1rnrnpublic:rn void Speak()rn rn printf("I am 1\n");rn ; rn;rnrnclass T2 :public T1rnrnpublic:rn void Speak()rn rn printf("I am 2\n");rn ;rnrn;rnrnrnvoid main()rnrn T1 *t1 = new T1();rn T1 *t2 = new T2();rnrn t1->Speak();rn t2->Speak();rnrnrn[/code]rnrn为什么t2调用的是父类的而不是自己的Speak()啊
父类的方法如何访问子类的属性?
using System;rnusing System.Collections.Generic;rnusing System.Text;rnrnnamespace WinApp20070519rnrn public interface JRrn rn string GetFullName();rn int GetAge();rn rnrn public class JiRi : JRrn rn public static string FullName = "JiRi";rn public int Age = 29;rnrn public JiRi()rn rn rnrn public virtual string GetFullName()rn rn return FullName;rn rnrn public virtual int GetAge()rn rn return Age;rn rn rnrn public class GaLa : JiRi, JRrn rn public static string FullName = "GaLa";rn public int Age = 30;rnrn public GaLa()rn rn rnrn // override 想省掉这个部分代码 rn public string GetFullName()rn rn return FullName;rn rnrn // override 想省掉这个部分代码 rn public int GetAge()rn rn return this.Age;rn rn rnrnrn-----------------------------------------------------------------rn如何不写 "想省掉这个部分代码" 的代码,也能正确获得 "GaLa", 30 的值rn若有人能解决,也可以直接发邮件到 jirigala_bao@hotmail.com 付费也可以.rn-----------------------------------------------------------------rnrn调用部分rnprivate void btnTest_Click(object sender, EventArgs e)rn rn // 直接调用rn this.txtFullName.Text = JiRi.FullName;rn JR myJR = new JiRi();rn this.txtGetFullName.Text = myJR.GetFullName();rn this.txtGetAge.Text = myJR.GetAge().ToString();rnrn this.txtFullName2.Text = GaLa.FullName;rn GaLa myGaLa = new GaLa();rn this.txtGetFullName2.Text = myGaLa.GetFullName();rn this.txtGetAge2.Text = myGaLa.GetAge().ToString();rn
在子类中,父类对象为什么不能访问父类的private属性
[code=Java]rnclass Father rn private int fage;rn public int getFage() rn return fage;rn rnrn public void setFage(int fage) rn this.fage = fage;rn rnrn int fweight;rn protected String fgender;rn public int fheight;rn rn public Father(int age, int weight, String gender, int height) rn this.fage = age;rn this.fweight = weight;rn this.fgender = gender;rn this.fheight = height;rn rn rn public Father() rn rn rnrnrnpublic class FatherAndSon extends Fatherrnrn private int sage;rn int sweight;rn protected String sgender;rn public int sheight;rn rn public FatherAndSon(int age, int weight, String gender, int height) rn super(55, 130, "male", 160);rn this.sage = age;rn this.sweight = weight;rn this.sgender = gender;rn this.sheight = height;rn rn rn public static void main(String[] args) rn Father f = new Father(50, 130, "male", 160);rn FatherAndSon s = new FatherAndSon(25, 130, "male", 170);rn [color=#FF0000]//System.out.println(f.fage); 为什么父类对象f在这里不能访问自己的private属性[/color]rn rnrnrn[/code]rn既然子类不能继承父类的private属性,那么也就无法直接访问父类的private属性。但是为什么在子类中,父类对象也不能访问自己的private属性呢?
C++ 子类转父类 父类确定子类
将一个结构体转换为字节数组,再讲字节数组还原成结构体,子类转换为父类,通过父类信息确定是哪个子类转换的父类
子类、父类
小弟有一问题:rnclass arnrn b u[];rnrnclass b :public arnrnrnrn这样会出问题吗?(就是在父类中引用子类)
父类、子类
子类对象创建之前,会产生父类对象。然后在父类对象基础之上,扩展子类特有的属性和方法。所以子类对象中包含完整的父类对象,就可以重用父类中定义的方法和属性。 子类对象创建之前,需要通过super()调用父类的够造方法,产生父类对象。如果子类构造方法中没有书写super(),这是,虚拟机会自动调用super()。如果父类中没有无参构造方法,子类必须通过super(参数)显示调用
子类 父类
[code=Java]rnpublic class SaveBiz rn byte[] message_type = new byte[ConstantSize.MESSAGE_TYPE_SIZE];rn byte[] processing_code = new byte[ConstantSize.PROCESSING_CODE_SIZE];rn byte[] trans_no = new byte[ConstantSize.TRANS_NO_SIZE];rn rn rn public byte[] getMessage_type() rn return message_type;rn rn public void setMessage_type(byte[] message_type) rn this.message_type = message_type;rn rn public byte[] getProcessing_code() rn return processing_code;rn rn public void setProcessing_code(byte[] processing_code) rn this.processing_code = processing_code;rn rn public byte[] getTrans_no() rn return trans_no;rn rn public void setTrans_no(byte[] trans_no) rn this.trans_no = trans_no;rn rn rnrnrnrnpublic class SubSaveBiz extends SaveBizrn byte [][]sortedBiz= new byte[][]rn super.message_type,rn super.processing_code,rn super.trans_no,rn ;rn public byte[][] getSortedBiz() rn return sortedBiz;rn rnrnrn[/code]rnrnrn如上code中,在父类SaveBiz 通过set方法来设置值,影响不到子类的sortedBiz数组里面的值...谁能解释一下??rn 如何才能让其同步??
子类如何屏幕父类的属性或者方法?
父类的Publish的方法我子类怎么屏蔽不让对象看到或者说使用
子类如何隐藏父类的属性
比如TA有个属性xrnTB是TA的子类,如何让TB隐藏属性xrnrn比如:rnvarrn a:ta;rn b:tb;rn x:Integer;rnbeginrn a:=ta.create;rn b:=tb.create;rn x:=a.x; //可通过编译rn x:=b.x; //不可通过编译rnend;
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池