派生类

C++多态性与虚函数

情到浓时终转凉″ 提交于 2019-12-22 00:51:33
  派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”。面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编。 (一)多态性   多态是指同样的消息被不同的对象接收时导致不同的行为。所谓消息是指对类成员函数的调用,不同的行为是指的不同的实现,也就是调用了不同的函数。 1)多态的分类   广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++中,这种多态性可以通过重载多态(函数和运算符重载),强制重载(类型强制转换),类型参数化多态(模板) ,包含多态(继承与虚函数)四种方式来实现。类型参数化多态和包含多态称为一般多态性,是用来系统地刻画语义上相关的一组类型;重载多态和强制多态性称为特殊多态性,用来刻画语义上无关连的类型间关系。   C++中采用虚函数实现包含多态。虚函数为C++提供了更为灵活的多态机制,这种多态性在程序运行时才能够确定,因此虚函数是多态性的精华,至少含有一个虚函数的类称为多态类。包含多态在面向对象的程序设计中使用很频繁。 2)静态联编   联编又称为绑定,就是将模块或函数合并在一起生成可执行代码的处理过程,同时对每个模块或函数分配内存地址,对外部访问也提供正确的内存地址。   在编译阶段就将函数实现与函数调用绑定起来称为静态联编

“继承”中的疑问——“隐藏方法”有什么用处

霸气de小男生 提交于 2019-12-21 05:45:56
需求 :在派生类里写方法时,想写一个和基类里一模一样的方法来使用 矛盾 :由于派生类共享基类的方法,调用时就会分不清调用的是派生类的方法,还是基类的方法 破解 :加个new关键字,这样派生类实例调用同名方法,就会如愿调用自己新写的方法了 (“一模一样”是指方法名 、参数以及返回值,但不包括内容) cat.EatFood()输出的是新定义同名方法的内容“猫吃鱼” 个人感觉 :隐藏方法的最终目的,无非是派生类想自己定义方法内容——我认为完全可以用重写基类方法来实现,没必要非得写的和基类一模一样。 来源: CSDN 作者: Unity李大馋师 链接: https://blog.csdn.net/weixin_42935398/article/details/103638936

C++三大特性之继承

非 Y 不嫁゛ 提交于 2019-12-20 18:16:49
原文地址:https://qunxinghu.github.io/2016/09/12/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E7%BB%A7%E6%89%BF/ 基本概念 继承 : 类的继承,就是新的类从已有类那里得到已有的特性。原有的类称为基类或父类,产生的新类称为派生类或子类。 基本语法 派生类的声明: class 派生类名:继承方式 基类名1, 继承方式 基类名2,...,继承方式 基类名n { 派生类成员声明; }; 在 c++ 中,一个派生类可以同时有多个基类,这种情况称为多重继承。如果派生类只有一个基类,称为单继承。派生类继承基类中除构造和析构函数以外的所有成员。 类的继承方式 继承方式规定了如何访问基类继承的成员。继承方式有public, private, protected。如果不显示给出继承方式,默认为private继承。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。 公有继承 当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中不变,而基类的私有成员不可访问。即 基类的公有成员和保护成员被继承到派生类中仍作为派生类的公有成员和保护成员 。派生类的其他成员可以直接访问它们。无论派生类的成员还是派生类的对象都无法访问基类的私有成员。 私有继承

C#面向对象复习第二天

Deadly 提交于 2019-12-20 05:02:24
例11 方法重载 方法重载是指调用同一方法名,但各方法中的参数的数据类型,个数或者顺序不同。 例12 属性与索引器 例13 封装、继承、多态 如果基类提供的功能不能满足要求,可以通过在派生类中重写基类的方法实现新的功能,在基类中用修饰符Virtual表示某个方法或者属性可以被同名方法或者属性重写,在派生类中使用的修饰符override表示对基类中的成员重写。 例14 抽象类 利用抽象类,可以声明仅定义了部分实现的类,让派生类提供某些或者全部方法的实现。 来源: CSDN 作者: 360不解释 链接: https://blog.csdn.net/qq_42777375/article/details/103591835

继承与派生

半世苍凉 提交于 2019-12-20 02:49:15
代码重用是提高软件开发效率的重要手段,C++对代码重用有很强的支持,"继承"就是支持代码 重用的机制之一。 继承:通过继承我们能够定义一些共享公共部分(基类)但保留各自特殊部分的类。派生类能够继 承基类定义的成员并使用它们。 从一个类派生处另一个类的写法: class 派生类名:继承方式说明符 基类名{ ...... } protected说明符:基类的受保护成员可以在派生类的成员函数中被访问。 在基类中一般将需要隐藏的成员说明为保护成员而非私有成员。 继承方式: 公用继承public:保留基类成员自己的访问级别 受保护继承protected:基类的私有成员仍为私有,protected与public成员在派生类中为protected成员 私有继承private:基类所有成员在派生类中都为私有成员 一般情况下都是使用public继承。 正确处理不同类之间的关系:复合关系和继承关系 复合关系:表现为封闭类,即一个类以另一个类的对象作为成员变量。 继承关系:即基类对象与派生类对象之间之间的关系。 再设计两个有关系的类时,并非只要两个类由共同点就让它们称为继承关系,让类B继承类A,必须 满足类B代表的事物也是类A代表的事物。 class fruit{ private: char *taste; double price; public: void Eat(char *name); };

linux下C++ 插件(plugin)实现技术

你说的曾经没有我的故事 提交于 2019-12-19 23:54:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> linux下C++ 插件(plugin)实现技术 作者: 掌门狗 时间: 2008-12-01 20:21 分类: 默认分类 标签: c++ 插件 应用程序中使用插件技术,有利于日后的版本更新、维护(比如打补丁)和功能扩展,是一种很实用的技术。其最大的特点是更新插件时无需重新编译主程序,对于一个设计良好的应用系统而言,甚至可以做到业务功能的在线升级。本文介绍了linux下用C++实现插件的一个简单实例,希望能对大家有所启发。 为了能做到更新插件时无需重新编译主程序,要求主程序中定义的接口是定死的,而接口的实现被放到了具体的插件中,这样主程序在运行时刻将插件加载进来,就可以使用这些接口所提供的功能了。在面向对象的系统中,各个功能模块被封装到类中,因此在C++中实现插件技术,就需要在主程序中提供基类,并为这些基类定义明确的接口,然后在插件(动态库或共享库)中定义派生类,并实现基类中所有的接口。 我们以计算多边形面积为例,首先定义一个基类CPolygon: /*+********************************************************/ /*+********************************************************/ /*+*******

C++ using关键字作用总结

↘锁芯ラ 提交于 2019-12-19 18:20:32
C++ using关键字作用总结 原本想对using的用法进行一个总结的,不过发现已经有人这么做了,而且写得不错,就直接引用啦,感谢原文作者 原文链接: https://www.cnblogs.com/ustc11wj/archive/2012/08/11/2637316.html 1.在当前文件中引入命名空间 这是我们最熟悉的用法,例如:using namespace std; 2.在子类中使用 using 声明引入基类成员名称(参见C++ primer) 在private或者protected继承时,基类成员的访问级别在派生类中更受限: class Base { public: std::size_t size() const { return n; } protected: std::size_t n; }; class Derived : private Base { . . . }; 在这一继承层次中,成员函数 size 在 Base 中为 public,但在 Derived 中为 private。为了使 size 在Derived 中成为 public,可以在 Derived 的 public 部分增加一个 using 声明。如下这样改变 Derived 的定义,可以使 size 成员能够被用户访问,并使 n 能够被Derived的派生类访问: class

ES6之JS的类

╄→尐↘猪︶ㄣ 提交于 2019-12-19 10:22:35
基本的类声明 类声明以 class 关键字开始,其后是类的名称;剩余部分的语法看起来就像对象字面量中的 方法简写,并且在方法之间不需要使用逗号。 class PersonClass { // 等价于 PersonType 构造器 constructor(name) { this.name = name; } // 等价于 PersonType.prototype.sayName sayName() { console.log(this.name); } } let person = new PersonClass("Nicholas"); person.sayName(); // 输出 "Nicholas" console.log(person instanceof PersonClass); // true console.log(person instanceof Object); // true console.log(typeof PersonClass); // "function" console.log(typeof PersonClass.prototype.sayName); // "function" 为何要使用类的语法? 类与自定义类型之间有相似性较高,但也要记住一些重要的区别: 类声明不会被提升,这与函数定义不同。类声明的行为与 let 相似

c++ 类的继承与派生

北城以北 提交于 2019-12-18 20:07:07
一、基本概念 1、类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类的过程就是类的派生。原有的类称为基类或父类,产生的新类称为派生类或子类。 2、派生类的声明: class 派生类名:继承方式 基类名1, 继承方式 基类名2,...,继承方式 基类名n { 派生类成员声明; }; 3、一个派生类可以同时有多个基类,这种情况称为多重继承,派生类只有一个基类,称为单继承。直接派生,间接派生。 4、继承方式规定了如何访问基类继承的成员。继承方式有public, private, protected。如果不显示给出继承方式,默认为private继承。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。 5、派生类继承基类中除构造和析构函数以外的所有成员。 6、派生类生成: 吸收基类成员(除构造析构函数以外的所有成员); 改造基类成员(根据继承方式调整基类成员的访问,函数在子类中的覆盖,以及虚函数在子类中的覆盖); 添加新的成员; 7、公有继承 当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中不变,而基类的私有成员不可访问。即基类的公有成员和保护成员被继承到派生类中仍作为派生类的公有成员和保护成员。派生类的其他成员可以直接访问它们。无论派生类的成员还是派生类的对象都无法访问基类的私有成员。 8、私有继承 当类的继承方式为私有继承时

3.继承与派生

只愿长相守 提交于 2019-12-18 15:18:19
1.类的继承与派生   - 类的继承:从已有类产生新类的过程。原有类称为基类或父类,产生的新类称为派生类或子类。   - 派生类语法:       class 派生类名:继承方式 基类名1,继承方式  基类名2,...     {     }   - 单继承和多继承:基类个数决定   - 直接基类,间接基类   - 继承方式规定了如何访问从基类继承的成员   - 派生类成员是指除了从基类继承的所有成员之外,新增加的数据和函数成员   - 派生类生成过程:吸收基类成员->改造基类成员->添加新的成员,构造函数和析构函数都不被继承 2.访问控制   - public:继承后,基类数据为public   - protected:继承后,基类数据为protected   - private:继承后,基类数据为private 3.类型兼容性规则:指在需要基类的任何地方,都可以使用公有派生类的对象来代替(公有继承)   - 代替包含以下情况     * 派生类的对象可以隐含转换为基类对象     * 派生类对象可以初始化基类的引用     * 派生类的指针可以隐含转换为基类指针   - 在代替之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员 4.派生类的构造和析构函数   - 构造函数:     派生类构造函数执行的一般次序     * 调用基类构造函数