派生类

C++ Virtual 完美诠释

半腔热情 提交于 2020-03-22 18:03:43
解答了我的一些疑问,觉得写的不错!!!转载一下。 virtual在英文中表示“虚”、“虚拟”的含义。c++中的关键字“virtual”主要用在两个方面:虚函数与虚基类。下面将分别从这两个方面对virtual进行介绍。 1.虚函数 虚函数源于c++中的类继承,是多态的一种。在c++中,一个基类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写基类中的成员函数。这里“重写”的要求是函数的特征标(包括参数的数目、类型和顺序)以及返回值都必须与基类中的函数一致。如下所示: 可以在基类中将被重写的成员函数设置为虚函数,其含义是:当通过基类的指针或者引用调用该成员函数时,将根据指针指向的对象类型确定调用的函数,而非指针的类型。如下,是未将test()函数设置为虚函数前的执行结果: 在将test()函数设置为virtual后,执行结果如下: 如此,便可以将基类与派生类的同名方法区分开,实现多态。 说明: 1.只需将基类中的成员函数声明为虚函数即可,派生类中重写的virtual函数自动成为虚函数; 2.基类中的析构函数必须为虚函数,否则会出现对象释放错误。以上例说明,如果不将基类的析构函数声明为virtual,那么在调用delete p2;语句时将调用基类的析构函数,而不是应当调用的派生类的析构函数,从而出现对象释放错误的问题。 3.虚函数的使用将导致类对象占用更大的内存空间

c++学习笔记一

我们两清 提交于 2020-03-22 14:54:28
定一个头文件person.h包含类的声明:每行后面的注释是学习过程中的体会与思考 #include<iostream> #ifndef PERSON_H_ #define PERSON_H_ class Person { private: int ID;//只有静态的常量数据成员才可以在类中初始化,与C#不一样 std::string Name; int Age; double Money; char * Address;//定义一个字符串指针成员 static int PersonNum;//定义一个静态变量记录对象的个数,静态变量要在源文件中初始化,如果没初始化会有错误,为什么? public: Person();//默认的构造函数 Person(int id,std::string name,int age,double m,const char* s);//带有参数的构造函数 Person(const Person & s);//定义复制构造函数 Person & operator=(const Person &p);//重载=操作符,实现深度复制 virtual ~Person();//析构函数 virtual void playway();//定义一个虚函数,通过虚函数实现多态 void GetName(); void SetPerson(int id, std:

[C#基础]基础知识一: 面向对象的基本知识.

落花浮王杯 提交于 2020-03-21 07:22:16
激励自己有时间多看看.!! C#基础共分为七个部分:   一: 面向对象 二: 值类型, 引用类型, 字符串操作   三: 集合文件操作   四: 正则表达式   五: XML操作   六: 委托, 事件   七: 反射 1, 面向对象:   面向对象的三大特性: 封装, 继承, 多态 2, 什么是类? 什么是对象? 类和对象的区别?   类: 类似模子, 确定对象将会拥有的特征(属性) 和行为 (方法)   对象是一个你能够看得到, 摸得着的具体实现-- 万物皆对象.     --类是模具, 创建对象的模具, 抽象的      .类是一组数据类型, 用户自定义的数据类型.      .类组成: 字段, 属性, 方法, 构造函数.     --对象是具体的, 是类的具体实例. 对象是具有属性(特征)和方法(行为)     --类中包含了数据(用字段标示)与行为(用方法(函数, 功能)标示, 方法为一块具有名称的代码) 3, 知识点总结 封装继承多态 一、封装:   封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 封装的意义:   封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。

C++中“强制转换”的四大天王

只谈情不闲聊 提交于 2020-03-17 06:32:28
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。 RTTI机制的产生 为什么会出现RTTI这一机制,这和C++语言本身有关系。和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致。有时我们需要将一个多态指针转换为其实际指向对象的类型,就需要知道运行时的类型信息,这就产生了运行时类型识别的要求。和Java相比,C++要想获得运行时类型信息,只能通过RTTI机制,并且C++最终生成的代码是直接与机器相关的。 我对Java的运行时类型识别不是很熟悉,所以查了一下相关资料:Java中任何一个类都可以通过反射机制来获取类的基本信息(接口、父类、方法、属性、Annotation等),而且Java中还提供了一个关键字,可以在运行时判断一个类是不是另一个类的子类或者是该类的对象,Java可以生成字节码文件,再由JVM(Java虚拟机)加载运行,字节码文件中可以含有类的信息。 typeid和dynamic_cast操作符 RTTI提供了两个非常有用的操作符

运行时类型识别RTTI

拟墨画扇 提交于 2020-03-17 05:39:22
1、什么是RTTI? RTTI:Run-Time Type Identification 运行时类型识别 程序在运行时能够使用 基类 的 指针 或引用来检查这些指针或引用所指的对象的实际的派生类。 在这里要用到两个C++中的关键字: typeid 和 dynamic_cast 2、typeid typeid是C++中一个用来获取变量类型的关键字,用法跟使用函数一样 typeid(xxx) typeid注意事项: (1)typeid返回的是一个 type_info 对象的引用,而这个引用是与具体的变量类型有关的, 也就是说不同的变量类型都有一个 type_info 结构体。type_info结构体如下: class type_info{ public: const char* name() const; // 打印具体类型的方法 一般这样用 typeid(x1).name() bool operator==(const type_info& rhs) const; // 运算符重载 支持直接 typeid(x1) == typeid(x2) bool operator!=(const type_info& rhs) const; // 运算符重载 int before(const type_info& rhs) const; virtual ~type_info(); // 析构函数

抽象基类、访问控制与继承和继承中的类作用域

我是研究僧i 提交于 2020-03-17 04:30:23
抽象基类 一个基类是抽象基类,它的虚函数必须是一个 纯虚函数 。纯虚函数是虚函数后加 =0 来定义的, =0 只能出现在虚函数的类内声明之后 : class Disc_quote : public Quote { public: Disc_quote() = default; Disc_quote(const std::string& book, doule price, size_t qty, double disc) : Quote(book, price), quantity(qty), discount(disc) {} // 纯虚函数 double net_price(size_t) const = 0; protected: size_t quantity = 0; double discount = 0.0; }; 抽象基类的定义:含有或者继承了纯虚函数(未覆盖)的类是一个抽象基类。 1. 抽象基类只负责定义接口; 2. 不能定义抽象基类的对象; 3. 一般来说,为纯虚函数提供定义是没有意义的, 毕竟在派生类中可能要覆盖该虚函数。也可以为这个纯虚函数提供定义,不过定义不能出现在类内; 4. 抽象基类的派生类必须将纯虚函数override, 否则该派生类也是一个抽象基类。 访问控制与继承 受保护的成员的访问控制

各种成员的访问规则

流过昼夜 提交于 2020-03-16 02:03:13
第一:private, public, protected 访问标号的访问范围。 private: 只能由1.该类中的函数、2.其友元函数访问。 不能被任何其他访问,该类的对象也不能访问。 protected: 可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。 但不能被该类的对象访问。 public: 可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。 注 :友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。 第二:类的继承后方法属性变化。 private 属性不能够被继承。 使用private继承,父类的protected和public属性在子类中变为private; 使用protected继承,父类的protected和public属性在子类中变为protected; 使用public继承,父类中的protected和public属性不发生改变; 如下所示: public: protected: private: public继承 public protected 不可用 protected继承 protected protected 不可用 private继承 private private 不可用 注: protected继承和private继承能降低访问权限。

虚拟继承解决二义性及数据冗余的原理

橙三吉。 提交于 2020-03-14 12:30:34
虚拟继承的原理 虚拟继承解决数据冗余和二义性的奥秘就在于,它在继承之后并不会创造出两个基类成员给派生类各自继承,而是在派生类中记录两个偏移量,大小为从派生类中继承的基类成员的地址到真正的基类成员地址,而这个真正的成员,被放在最后一次继承的派生类(D类)的末尾。 如图所示,在不使用虚拟继承的前提下,各个类定义定义变量后我们可以看看他们各自所处的地址如下: 可以看出,A,B类继承的m_n处于不同的地址,是两个成员。而使用虚拟继承后他们所处地址的内容变成了如下: 可以看出,原本为值‘3’和‘4’的地方变成了两个偏移量,而我们调取这两个偏移量之后可以看到如下: e8 d2 f5 00 :12(H) ac cb f5 00 :20(H) 而我们发现,从起始位置到下面04的位置(D类中的末尾),偏移字节正好是12和20。 其实, 这里是通过B和C的两个指针,指向一张表,这两个指针叫做虚基表指针,这两个表叫虚基表,虚基表中存的偏移量,通过偏移量可以找到下面的A。 Ps:并不是所有派生类共用一分虚基表,每个派生类都有自己的表; 来源: 51CTO 作者: wx5cb188ffabeef 链接: https://blog.51cto.com/14289397/2478237

ASP.NET 2.0 XML 系列(4):用XmlReader类介绍

柔情痞子 提交于 2020-03-14 05:55:50
(本文摘自MSDN) XmlReader 类是一个提供对 XML 数据的非缓存、只进只读访问的抽象基类。该类符合 W3C 可扩展标记语言 (XML) 1.0 和 XML 中的命名空间的建议。 XmlReader 类支持从流或文件读取 XML 数据。该类定义的方法和属性使您可以浏览数据并读取节点的内容。当前节点指读取器所处的节点。使用任何返回当前节点值的读取方法和属性推进读取器。 XmlReader 类使您可以: 检查字符是不是合法的 XML 字符,元素和属性的名称是不是有效的 XML 名称。 检查 XML 文档的格式是否正确。 根据 DTD 或架构验证数据。 从 XML 流检索数据或使用提取模型跳过不需要的记录。 使用XmlReader读取XML文档之前,我们有必要了解一下这个类的属性和方法,以及节点XmlNode的类型。 1. XmlReader类的属性 名称 说明 AttributeCount 当在派生类中被重写时,获取当前节点上的属性数。 BaseURI 当在派生类中被重写时,获取当前节点的基 URI。 CanReadBinaryContent 获取一个值,该值指示 XmlReader 是否实现二进制内容读取方法。 CanReadValueChunk 获取一个值,该值指示 XmlReader 是否实现 ReadValueChunk 方法。 CanResolveEntity

赋值兼容原则

馋奶兔 提交于 2020-03-13 18:39:38
在C++中,无论哪种继承方式下派生类都会把父类所有的数据继承,区别在于是否能访问 赋值兼容规则如下: 1.可以直接用派生类对象给基类对象赋值 2.可以直接用派生类对象的地址给基类指针赋值 3.可以使用派生类对象为基类的引用直接进行初始化 但该原则不能反向运行,愿意如下: 实例化一个类型时要调动构造方法,而子类在构造前要先构造父类对象,编译器提前开辟出子类加父类总大小的空间。父类成员构造完成后先放入,再把子类成员构造出来加在后面,而继承则是把所有成员放在一起构成子类对象。子类可以给父类赋值是因为子类成员包括了父类成员,赋值时只是用到了和父类相同的空间(称之为对象切片),父类需要什么成员,子类都可以一一提供。而反过来父类做不到提供子类需要的所有的成员。 来源: 51CTO 作者: wx5cb188ffabeef 链接: https://blog.51cto.com/14289397/2478117