关于继承(子类对象与父类对象【相互转换】的过程)

<1>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace list
{
    class A
    {

    }
    class B : A
    {
        public A MyMthod()
        {
            //你想想看这个MyMthod()方法的返回值类型明明是A类型,为什么这里返回一个B类型对象也不报错呢?
            return new B(); //因为B类型是A类型的子类,子类对象可以隐式的转换成父类对象。这里已经将B类型隐式的转换成A类型并将它返回了。所以它不会报错。
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();

            a = b; //子类对象可以赋值父类对象
            //b = a; //父类对象不可以赋值给子类对象
            b = (B)a;

            //举个例子:假如父类是 “人” 它有两个子类,一个“中国人”类,一个“美国人”类
            //也就是说 new一个中国人的对象“李小龙” new一个美国人的对象“奥巴马”
            // new 一个 “人"的对象 "人1"
            //子类对象“李小龙”,“奥巴马”肯定是可以赋值给“人”这个父类对象人1的。因为“人1”可以是中国人,也可以是美国人,只要是人就可以了。这里你给我一个“李小龙”,或者“奥巴马”肯定是可以的。

            //而父类对象 “人1”赋值给子类对象“李小龙”或者子类对象“奥巴马”就不可以了。
            //因为“李小龙”是中国人类型 ,中国人类型就只能接收中国人类型,所以当你把一个“人”类型对象赋值给“中国人”类型对象的时候,就出错了。我管你要一个中国人,你给我一个人1。我怎么知道你这个“人1”是不是中国人呢?你也可能是美国人,也可能是德国人。对吧。
            //除非 你给我指定说,这个人一定是一个中国人。“李小龙”=(中国人)“人1”

        }
    }
}
时间: 2024-10-17 13:31:26

关于继承(子类对象与父类对象【相互转换】的过程)的相关文章

C++学习基础十——子类对象向父类对象的转化

一.C++中可以实现子类向父类的转换,主要分为三种形式: 1.对象转换:不能实现动态绑定,即不能实现多态. 2.引用转换:动态绑定,实现多态. 3.指针转换:动态绑定,实现多态. 注意:一般不会出现父类转化为子类的情况. 二.代码片段如下: 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Item_base 7 { 8 public: 9 Item_base(const str

父类指针可以直接指向子类对象,父类引用可以直接引用子类对象

1 #include<iostream> 2 #include<string> 3 using namespace std; 4 class parent{ 5 public: 6 int mi; 7 void add(int v){ 8 mi += v; 9 } 10 void add(int a,int b){ 11 mi += (a+b); 12 } 13 }; 14 class child:public parent{ 15 public: 16 int mv; 17 vo

构造函数的继承--子类不继承父类的构造函数,只能调用

关于子类对父类构造函数的继承: 子类必须调用父类的构造函数.默认情况下会自动调用父类的无参构造函数.如果父类没有无参构造函数,则必须显式的用super()调用一个构造函数. 创建对象时,先调用父类的构造函数对对象进行初始化, 然后再调用子类自己的构造函数 子类只继承(其实是默认调用)父类的默认(无参)构造函数,如果父类重写了自己的构造函数,就会导致父类没有无参构造函数,这样子类就不能从父类继承构造函数.

为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型

假设有父类Fu ,其子类为Zi ,从对象的内存角度,假设Fu类里面的变量占内存2M, Zi 类里的变量占内存1M: Fu f = new Fu ();//系统将分配2M内存 Zi z = new Zi ();//系统将分配3M内存(2+1) 因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.所以z可以调用父类的方法. Zi z1= z; //z1指向那3M的内存. Fu f1 = (Fu)z;//这时f1会指向那3M内存中

用父类对象给子类对象赋值数据

在写毕业设计的时候遇到了一些小问题,当创建一个VO类的时候,继承原先的PO类再添加新的属性比较快捷方便,但是将PO类转换成VO类就会需要先get再set所有属性.虽然说是面向ctrl+c.ctrl+v编程,但是还是想偷懒,所以有了以下代码: /** * 将父类对象的属性值转储到子类对象中,仅限于get(is)方法set方法规范且并存,更适用于数据库实体类,不适用于功能性类 * @param <T> * @param son 子类对象 * @param father 父类对象 * @throws

关于protected在子类创建父类对象无法访问父类protected方法或成员

子类(父类的外部包)中访问父类的protetcted属性或者方法,是不可以通过创建父类对象调用的.注意:此处不讨论同包下的父类子类,因为同包下所有类都可访问protected属性或者方法. 请参见Java官方文档:Chapter 6. Names中的6.6.2.1. Access to a protected Member具体例子如下: 父类C:在包c下 1 package c; 2 public class C { 3 protected int id; 4 protected void te

C#父类对象和子类对象之间的转化

1. 子类到父类 Chinese c = new Chinese(); Person p1 = c;  //从变量c看是一个中国人,所以可以把人的标签贴上去 2. 父类到子类 Chinese c2 = p1; //从变量p1看是一个人,不能随便把中国人的标签贴上去  不成功,必须显式转化如下,两种方式: (1)Chinese c2 = (Chinese)p1; (2)Chinese c2 =  p1 as Chinese; 上面两种方式的区别,看如下代码 p1 = new Japanese();

父类对象对子类对象方法的调用

1 import copy 2 class Dog: 3 def Eat(self): 4 print("Dog Eating...") 5 class Son: 6 def __init__(self): 7 self.height=100 8 def Eat(self): 9 print("Son Eating...") 10 class Father: 11 def LetSonEat(self,m): 12 if(isinstance(m,Son)): 13

当构造一个对象的时候,系统先构造父类对象,再构造子类对象

当构造一个对象的时候,系统先构造父类对象,再构造子类对象. 构造一个对象的顺序:(注意:构造父类对象的时候也是这几步) ① 递归地构造父类对象: ② 顺序地调用本类成员属性赋初值语句: ③ 本类的构造方法. 1 package TomText; 2 3 public class TomText_17 { 4 /* 5 * 顺序输出数组里的值 6 */ 7 public void printArray(int[] i) { 8 for(int m=0;m<i.length;m++) { 9 Sys