派生类

c#继承与派生

耗尽温柔 提交于 2020-03-13 00:45:41
c#继承与派生 继承 一个类可以派生自多个类或接口,这意味着它可以从多个基类或接口继承数据和函数。 protected标识的变量只用于继承给派生类使用 基类的初始化 派生类不能在成员初始化列表中直接初始化基类的成员 派生类继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。您可以在成员初始化列表中进行父类的初始化。 构造函数是不可继承的,因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员,“越级初始化”。 派生类的构造函数的一般格式为: 派生类名(形参表):基类名1(形参表1),基类名2(形参表2)··· {···} 注意 : 在创建派生类对象时,先调用基类的构造函数,然后调用派生类的构造函数;撤销对象时,析构函数被调用的顺序则相反。 若派生类中包含对象成员,则派生类的构造函数初始化成员列表中既要列出基类的构造函数也要列出对象的构造函数。派生类定义对象时,先调用基类的构造函数,再调用对象的构造函数,最后调用派生类的构造函数。 多重继承 c#不支持多重继承,但是可以使用接口实现多重继承。 C# 接口(Interface) 来源: https://www.cnblogs.com/monkey-moon/p/9180500.html

C++中空类有没有大小?

送分小仙女□ 提交于 2020-03-12 01:51:28
C语言不允许定义一个空的结构体,但在C++中,与结构体概念相同的类却允许空定义,那这个空的类有没有大小呢? 在sizeof(Test)之后我们会发现,他的大小为1个字节。那么这个1字节是哪里来的呢?其实在底层,系统都会为空类分配1字节的空间大小,我们知道空类可以实例化,而每个实例在内存中都有唯一的地址,分配1字节的空间是为了实例化之后使这个类在内存有唯一的空间地址。而当类中放入成员后,这个1字节就会自动消失。 那么另一个问题来了,如果一个类被派生类继承后,大小会是多少。按照正常思维,空的基类大小为1字节,空的子类大小也为1字节,那继承之后总大小应该是2字节。 但是在sizeof(SonTest)之后我们会发现,派生类大小还是一个字节。 那这个1字节到底是基类的大小还是派生类的呢?其实,它既非基类大小也非派生类大小,而是系统“施舍”给这对“空父子”的,可以形象的理解为,公司要留着这个人(类),而它肚子里什么都没有(空类),所以公司要给他一个名分(1字节)。 来源: 51CTO 作者: wx5cb188ffabeef 链接: https://blog.51cto.com/14289397/2477470

派生类访问基类的私有成员

旧时模样 提交于 2020-03-11 05:01:37
派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数。实现方法有如下两种: 1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员。 2.将需要访问基类私有成员的派生类成员函数声明为友元。 [cpp] #include<iostream> using namespace std; class Base { friend class Derived2;//friend int x; protected://protected int y; }; class Derived1:Base//private继承 { public: /* int getx() { return x;//不合法,访问基类的private成员 }*/ int gety() { return y;//合法,访问基类的protected成员 } }; class Derived2:Base//private继承 { public: int getx(); }; int Derived2::getx() { return x;//友员直接访问基类的私有成员 } class Derived3:public Base//public继承 { public: /* int getx() { return x;//在这里还是不能访问,因为x是Base的private成员

C++类的大小计算汇总

≯℡__Kan透↙ 提交于 2020-03-11 03:59:33
  C++中类涉及到虚函数成员、静态成员、虚继承、多继承、空类等。   类,作为一种类型定义,是没有大小可言的。   类的大小,指的是类的对象所占的大小。因此,用sizeof对一个类型名操作,得到的是具有该类型实体的大小。 类大小的计算,遵循结构体的对齐原则; 类的大小,与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数、静态成员函数、静态数据成员、静态常量数据成员,均对类的大小无影响; 虚函数对类的大小有影响,是因为虚函数表指针带来的影响; 虚继承对类的大小有影响,是因为虚基表指针带来的影响; 静态数据成员之所以不计算在类的对象大小内,是因为类的静态数据成员被该类所有的对象所共享,并不属于具体哪个对象,静态数据成员定义在内存的全局区; 空类的大小( 类的大小为1 ),以及含有虚函数,虚继承,多继承是特殊情况; 计算涉及到内置类型的大小,以下所述结果是在64位gcc编译器下得到(int大小为4,指针大小为8); 一、简单情况的计算 #include<iostream> using namespace std; class base { public: base()=default; ~base()=default; private: static int a; int b; char c; }; int main() { base obj; cout<<sizeof

C++三大特性

青春壹個敷衍的年華 提交于 2020-03-10 23:58:03
封装继承和多态 封装:隐藏实现细节,使得代码模块化,封装就是把过程和数据包装,将客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操纵,对其他信息隐藏。 类继承是指C++提供来扩展和修改类的方法,类继承就是从已有的类中派生出新的类,派生类继承了基类的特性,同时可以添加自己的特性,继承又分为 单一继承 多重继承 菱形继承 多态是在具有继承关系的类对象中去调用某一虚函数时(使用基类的指针/引用去调用同一函数),产生了不同的行为,构成多态的条件有两个( 说白了就是通过指针/引用在不同时候调用同一函数可能调用的是不同的版本,多态是指接口的多种不同实现方式 ) 调用函数的对象必须是指针或者引用 被调用的函数必须是虚函数,且完成了虚函数的重写(不覆盖会调用派生类的函数吗?) 动态(类型)绑定/静态(类型)绑定 静态类型:对象在声明时的类型,其在编译时决定 动态类型:变量所指向内存中该对象的类型(通常指指针/引用所绑定对象的类型),在运行期决定 静态类型决定了某个函数能不能被调用,而动态类型则在动态绑定发生时决定调用该函数的哪个版本 如果不使用指针和引用,则静态类型和动态类型一定相同 静态绑定:也叫静态联编,绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译器 动态绑定:也叫动态联编,绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型

python类的学习:前言

爱⌒轻易说出口 提交于 2020-03-08 17:58:15
前言 在面向对象程序设计中,把数据以及对数据的操作封装在一起,组成一个整体(对象),不同对象之间通过消息机制来通信或者同步。对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了类。 创建类时用变量形式表示对象特征的成员称为数据成员,用函数形式表示对象行为的成员称为成员方法,数据成员与成员方法统称为类的成员。 以设计好的类为基类,可以继承得到派生类,缩短开发周期,实现代码的复用。 派生类中还可以对基类继承而来的某些行为进行重新实现,从而是得基类的某个同名方法在不同派生类中的行为不同,体现出一定的多态特性。 封装、继承、多态是面向对象程序设计的三个要素。 本章学习目标: 掌握类的定义语法 掌握对象的创建语法 理解数据成员与成员方法的区别 理解私有成员与公有成员的区别 理解属性的工作原理 了解继承的基本概念 了解特殊方法的概念与工作原理 来源: CSDN 作者: weixin_45700973 链接: https://blog.csdn.net/weixin_45700973/article/details/104729350

派生类的构造函数与析构函数的调用顺序

你。 提交于 2020-03-07 21:39:59
派生类构造函数各部分的执行次序为 1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用。 2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用 3.派生类的构造函数体中的操作 在派生类构造 函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表 如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数。 如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。 //Test1.h #include<iostream> using namespace std; class Base1 { private: int a1; public: Base1()//(int _a):a1(_a) { cout<<"It's base1 built. "<<endl; } ~Base1(){cout<<"Base1 was free. "<<endl;} }; class Base2 { private: int a2; public: Base2()//(int _a):a2(_a) { cout<<"It's base2 built. "<<endl; } ~Base2(){cout<<"Base2 was free. "<<endl;} }; class Base3 { private: int a3; public:

XmlReader

廉价感情. 提交于 2020-03-07 16:20:43
  XmlReader用于读取Xml文件,XmlWriter用于将数据写到Xml文件。其实,在印象当中,XML很多的操作类都支持直接Save、Read也支持接受XmlReader与XmlWriter类的示例作为参数,但是为什么还要有这个两类来专门用于读写XML文件呢?因为它们有强大的自定义格式功能; 一、XmlReader的使用   XmlReader类专门用于读取Xml文件,最大的特点在于支持Settings。 属性 说明 AttributeCount 当在派生类中被重写时,获取当前节点上的属性数 BaseURI 当在派生类中被重写时,获取当前节点的基 URI CanReadBinaryContent 获取一个值,该值指示 XmlReader 是否实现二进制内容读取方法 Depth 获取 XML 文档中当前节点的深度 EOF 获取一个值,该值指示此读取器是否定位在流的结尾 HasAttributes 获取一个值,该值指示当前节点是否有任何属性 HasValue 获取一个值,该值指示当前节点是否可以具有 Value IsDefault 获取一个值,该值指示当前节点是否是从 DTD 或架构中定义的默认值生成的特性 IsEmptyElement 获取一个值,该值指示当前节点是否为空元素(例如 <MyElement/>) Item 获取具有指定索引的属性的值,支持整形,字符串

虚函数和纯虚函数

﹥>﹥吖頭↗ 提交于 2020-03-03 11:56:43
class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class B:public A { public: void foo() { cout<<"B::foo() is called"<<endl; } }; int main(void) { A *a = new B(); a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! return 0; }   上诉代码是虚函数的一个例子。其中B类继承A类,由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。而虚函数只能借助于指针或者引用来达到多态的效果。 纯虚函数 一、定义: virtual void funtion1()=0   纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 二、引入原因: 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。   为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法

C++复习知识点总结(二)

独自空忆成欢 提交于 2020-03-02 01:15:28
一:C++多态与虚函数 1:基类的指针也可以指向派生类对象 People *p = new People(“王志刚”, 23) p = new Teacher(“赵宏佳”, 45, 8200);//指向派生类对象 调用函数时会出错(people的函数中没有第三项,及8200的数据),即当基类指针 p 指向派生类 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数 基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数,C++ 增加了虚函数(Virtual Function)。使用虚函数非常简单,只需要在函数声明前面增加 virtual 关键字。即:virtual 类型 函数名 对于派生类比较多,如果不使用多态,那么就需要定义多个指针变量,很容易造成混乱;而有了多态,只需要一个指针变量 p 就可以调用所有派生类的虚函数。 2:虚函数注意事项及条件 虚函数对于多态具有决定性的作用,有虚函数才能构成多态。 只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。 基类中的函数声明为虚函数,这样所有派生类中具有遮蔽关系的同名函数都将自动成为虚函数 只有派生类的虚函数覆盖基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)。例如基类虚函数的原型为virtual void func();