C#-派生类

VS派生类

  • 继承。派生类

class AClass : FClass

构建函数继承 public classname (string astring): base(astring){};默认不继承基类的构建函数。基类的在前面执行,然后执行派生类构建函数中的代码。

  • 多态性

http://www.cnblogs.com/zhangkai2237/archive/2012/12/20/2826734.html

即看对象变量引用的是哪个类的实例,优先用对应类的方法,如果没有,到基类找。

一说同名操作,有多种,包含重载、重写、隐藏方法等

重写即派生类重写基类方法

基类定义允许重写

public virtual viod methodname(){}

派生类重写

public override viod methodname(){}

方法名必须相同;参数列表必须相同;相同的返回值;存取权限相同

  • 隐藏基类成员

用于版本,用new定义

隐藏域

基类 public string astring;

派生类public new string astring;

隐藏方法

参数必须相同。

基类public classname(string:astring);

派生类public new classsname(string:astring);

(1)隐藏方法不但可以隐藏基类中的虚方法,而且也可以隐藏基类中的非虚方法。

(2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法。

(3)和上一条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果引用的是父类的实例那么调用基类的方法,如果引用的是派生类的实例则调用派生类的方法。

  • 区别隐藏和重写

http://www.cnblogs.com/Grisson/archive/2005/09/01/227467.html

“重写”:允许使用现有成员的一个新实现代替基础类实现。换句话说就是允许使用自己的实现代替相

同名称的一个基类成员。

“隐藏”:可以模糊一个基类的成员并用一个完全不同的新实现代替它。

“重写”:在基类中要被重写的方法要修饰为virtual,在子类中该方法要被修饰为overrride。

新实现的方法必须与要被重写的方法有相同的函数名,函数签名,返回类型以及

访问级别。(简单来说就是除了virtual/override,其他函数声明完全一致)

“隐藏”:子类中的方法要被修饰为new

子类中的方法与要被隐藏的方法有相同的函数签名并且是相同种类的成

员,但是它可以拥有不同的访问级别,返回类型以及函数实现 。

“重载”:一个重载的方法必须拥有于先前存在的方法有相同函数名字,而且必须拥有不同

的函数签名,至于返回类型和访问级别可以相同也可以不同

任何拥有于先前存在的方法相同的函数名,不同色调签名方法,都将被看做是那个方法的一个重载并且不会隐藏先前存在的方法

如果一个继承类被强制转换为的他的一个基类并且一个重写的方法被调用:

if 新的方法是重写的,则对象的类型决定那个方法被调用,而不是变量。

这种情况下继承类的方法被调用

if 新的方法是隐藏的,则变量的类型决定那个方法被调用,而不是对象。

这种情况下基类的方法被调用

  • 抽象方法

在基类中定义的并且必须在派生类中重写的方法,

在基类使用abstract关键字定义

在派生类使用overide关键字定义

  • 版本

定义了基类虚方法后,子类定义同名方法,但没写new或override,会出现编译错误,所以子类要定义关键字。

  • System.Object类

所有类都隐含从这个类派生。

比较有用的方法有。ToString(),返回一个与对象的类名相等的字符串,mycar.ToString()等于类名Car;静态方法Equals(object,object),Car.Equals(mycar,myothercar),对比两个对象是否相等;静态方法ReferenceEquals(object,object),对比两个对象引用是否引用同一个对象,Car.ReferenceEquals(mycar,myothercar);GetType()返回对象的类,或返回变量的类型,mycar.gettype()返回类名;Finalize(),允许对象在垃圾收集器从内存删除对象之前进行清除工作;MemberwiseClone,创建对象的拷贝,mycar.MemberwiseClone返回拷贝对象。

比如,可在类中重写虚方法ToString,实现返回一个域值

  • 重载System.Object类方法

因为都是从System.Object类继承,所以可重载System.Object类的虚方法virtual

  • 包装和解包

包装:把变量隐式包装成一个system.object对象,简写成object

解包:把变量包装的object对象,解包成变量。

int myint =10;

可显示写成

int myint =10;

object myobject = myint;这里是包装

int myint2 = (int)myobject;这里是解包

因为有隐含的包装和解包,可以像使用对象一样使用变量,如myint.tostring(),如myint.gettype()。

  • 抽象类和抽象方法

抽象类用abstract,代表概念,可派生出代表实际的类

抽象方法也是abstract,在派生类中,这个方法必须被重写,并必须包含代码。

特点,不能创建抽象类的对象;不能标记构建函数为抽象的;可以用抽象类派生另一个类(包括抽象类);必须在派生类用代码重写基类的抽象方法。

  • 密封类和方法sealed

密封类和密封方法限制继承和多态。即不能继承密封类,不能重载重写密封方法。在public等前加sealed

  • 强制转换对象

基类和派生类之间可互相转换,可跨级转换,只要其中一个类是另一个类的基类或更上级基类。

转换后的效果是,只能存取转换后的类的成员了。

向上转换,转换成基类fatherclass myfatherclass = (fatherclass) mychildclass;

向下转换,转换成派生类 childclass mychildclass = (childclass )myfatherclass;

  • 存取访问限制
  • 重载运算符

重写算术运算、比较值等。

比如==,当比较对象时,其实比较的是对象变量的引用,如果想比较对象的实例域,就不能用默认的静态的==了,可以用重写默认的静态的==,如果重写了==和Equals,就必须重写!=,即重写了一个运算符,就必须重写与其相对的运算符,如==和!=,<和>。

public static bool operator == (class1 myclass1,class2 myotherclass1){}

比如+,当比较对象时,会编译报错,因不能简单的加两个对象,可以重写+,实现加对象的实例域的值。

public static class1 opertator +(class1 myclass1,class2 myotherclass1){}

时间: 2024-12-24 10:33:58

C#-派生类的相关文章

多继承(虚继承)派生类对象内存结构

在这里谈一下虚继承.前面写过派生类对象的内存结构,都是基于VS2010编译器的,不同的编译器对于继承的处理不同,但本质都是一样的. 虚继承是解决共享基类问题的.例如在菱形继承中 如果不使用虚继承,基类A在D中会有两个,这不仅浪费内存,还会造成歧义.使用虚继承就可以解决基类共享的问题. 要想在派生类中共享基类(例如在D对象中只有一个A对象,这时候D对象中的B对象和C对象都可以查找到A,而不是在B对象和C对象中各含有一个A对象). 先看下面一个例子: #include<iostream> usin

从设计基类及其派生类看继承关系

继承能够定义可重用.扩展或修改父类行为的子类.但基类的静态构造函数.实例构造函数和析构函数不能被派生类继承. 在下面实例中,定义一个基类Publication用于表示任何类型的出版物以及派生至Publication的其他类型Book类,由此也可以扩展为定义其他类型如:Magazine.Journal.Newspaper和Article. 在设计基类Publication时我们必须考虑到如下关系: 1.要在基类中添加哪些成员 2.基类是否用作派生类模板的抽象基类 3.类层次结构的扩展空间大小,要开

派生类和基类的转换

指针引用分四种情况: 1.直接用基类指针引用基类对象 2.直接用派生指针引用派生对象 3.由基类指针引用派生类对象,由于派生类也是基类对象(包含关系),所以这种引用是安全的.但是只能引用基类成员,若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误.(解决该问题的答案是虚函数和多态性) 4.用派生类指针引用基类对象,这种方式会导致编译器报错.必须先把派生类指针强制转换成基类指针. 如果基类和派生类都定义了同名函数,通过对象指针调用成员函数时,到底调用哪里的函数由指针的原始类型决

C#派生类中使用基类protected成员的方法

我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被protected修饰时,我们应该怎么在派生类中使用基类成员呢,下面将介绍使用方法. 首先我们贴一段错误的使用代码: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.ReadLine(); 6 7 } 8 } 9 pub

【总结】C++基类与派生类的赋值兼容规则

在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则: 1.子类对象可以赋值给父类对象(切割/切片) 在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公有继承会产生"is-a"的关系,这种关系会导致子类中有结构的嵌套这父类的信息,.所以子类可以给父类赋值,期间会发生类似降级的事情,使得赋值成功.若为私有继承,则会产生"has-a"的关系,这种关系是从属关系,基类中的数据仅仅是包含在派生类中,若赋值,则不会产生类似于降级的事

【C++学习之路】派生类的构造函数(二)

二.有内嵌对象的派生类 1.一般来说,我们会这样定义构造函数 student( int i, string nam, int pid, string pnam, int sid) : person( i, nam),parent(pid,pnam){ stuid = sid; } person是基类的构造函数,parent是该派生类内嵌的person子对象   2.具体例子 1 #include <iostream> 2 using namespace std; 3 class A 4 { 5

C++:基类与派生类对象之间的赋值兼容关系

4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量.这种不同类型之间的自动转换,称为赋值兼容.在基类和派生类对象之间也存在有赋值兼容关系,基类和派生类对象之间的赋值兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来代替.因为,通过公有继承,除了构造函数和析构函数外,派生类保留了基类其他的所有的成员.那么,派生类就具有基类的全部功能,凡

对C++中派生类的构造函数和析构函数的认识

一:构造函数 形式:派生类名::派生类名:基类名1(参数1),基类名2(参数2),--基类名n(参数n),数据成员1(参数1),数据成员2(参数2),--数据成员n(参数n){ 各种操作的说明 } 执行过程:先执行基类的构造函数,再进行数据成员的赋值,最后执行函数体. 其中基类名和数据成员的顺序是由在派生类的定义中声明的顺序决定执行的顺序的,因此它们的顺序是任意的,但为了可读性,还是最好按顺序写. 如果基类只有默认构造函数,则基类名和参数表可以不用写出来. 二:复制构造函数 派生类的构造函数的形

关于java可变(协变)返回类型的解说之一------------基类与派生类

在java代码中,人们惯性的认为一个方法中只能返回一种返回值或者无返回.博主在做开发过程中碰到了这样一种情况,安卓客户端请求数据,后台可能返回两种结果(1)访问令牌失效,无数据返回.(2)正常获取数据. 这样的情况下需要根据访问令牌标识来判断是否有数据返回.当无效时返回用户重新登录提示,正常时则返回数据.显然,返回的结果有两种,那么一个方法里面只能返回一种类型的禁锢使得开发起来略显笨拙.使得开发起来相当难受. 思考良久,又结合C++协变返回类型的启发.摘抄原文中的一句话:在C++中,只要原来的返

C++构造函数 &amp; 拷贝构造函数 &amp; 派生类的构造函数 &amp; 虚继承的构造函数

构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载.(摘自百度百科构造函数). 一.最基本的构造函数 1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 private: 8 int m_Var; 9 }; 以上构造函数的执行过程: