多态

Interview_C++_day15

怎甘沉沦 提交于 2020-02-22 19:43:52
开始刷C++部分面经 虚函数表、虚函数指针内存位置 虚函数表存储在常量区,也就是只读数据段 虚函数指针存储在对象内。 使用宏定义求结构体成员偏移量 #include<bits/stdc++.h> #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) /* (TYPE*)0 将零转型成 TYPE 类型指针 ((TYPE*)0->MEMBER) 访问结构体中的成员 &((TYPE*)0->MEMBER) 取出数据成员地址,也就是相对于零的偏移量 (size_t) & ((TYPE*)0)->MEMBER) 将结果转换成 size_t 类型。 */ struct Node { char a; short b; double c; int d; }; int main() { printf("%d\n", offsetof(Node, a)); printf("%d\n", offsetof(Node, b)); printf("%d\n", offsetof(Node, c)); printf("%d\n", offsetof(Node, d)); return 0; } \(size\_t\) 在可以理解成 \(unsigned\ \ int\) ,在不同平台下被 \(typedef\) 成不同类型。 \(C\) +

C#里封装 继承 多态

白昼怎懂夜的黑 提交于 2020-02-22 17:37:09
一、封装 C#中可使用类来达到数据封装的效果,这样可以使数据与方法封装成单一元素,以便于通过方法存取数据。除此之外,还可以控制数据的存取方式。 在面向对象编程中,大多数都是以类作为数据封装的基本单位。类将数据和操作数据的方法结合成一个单位。设计类时,不希望直接存取类中的数据,而是希望通过方法来存取数据。这样就可以达到封装数据的目的,方便以后的维护升级,也可以在操作数据时多一层判断。 此外,封装还可以解决数据存取的权限问题,可以使用封装将数据隐藏起来,形成一个封闭的空间,然后可以设置哪些数据只能在这个空间中使用,哪些数据可以在空间外部使用。一个类中包含敏感数据,有些人可以访问,有些人不能访问,如果不对这些数据的访问加以限制,后果将会非常严重。所以要对类的成员使用不同的访问修饰符,从而定义他们的访问级别。 封装语法: Public 数据类型 变量名 { get { return 变量名 } set { 变量名=value; } } 当然了!get和set有快捷键的:光标选择要封装的属性然后右键点击快速操作和重构…(Chrl+.)点击封装字段(并使用属性) 二、继承 继承是面向对象最重要的特性之一。任何类都可以从另外一个类继承,这就是说,这个类拥有它继承类的所有成员。在面向对象编程中,被继承的类称为父类或基类。C#中提供了类的继承机制,但只支持单继承,而不支持多继承,即在C

(十)C++基础之类的多态

余生颓废 提交于 2020-02-22 06:31:12
一、C++基础之类的多态 1.1、多态的含义 1.2、多态发生的条件 1.3、虚析构函数 1.4、重载、重写、重定义 1.5、多态实现的原理 1.6、纯虚函数和抽象类 1.7、自己的一些总结 1.1、多态的含义 如果有几个上似而不完全相同的对象,有时人们要求在向它们发出同一个消息时, 它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。 C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。 多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统 升级,维护,调试的工作量和复杂度。 这才是面向对象真正实用的东西,其实前面类的封装、和继承在C语言中都可以实现,但是多态是属于面向对象的一个特点。 1.2、多态发生的条件 我们先来看一段代码: # include <iostream> using namespace std ; class Student { public : void doing ( void ) { cout << "学习数学中" << endl ; } private : } ; class Sporter : public Student { public : void doing ( void ) { cout << "打球" << endl ; } private : }

多态与多态性

梦想的初衷 提交于 2020-02-21 16:00:26
# 多态指的是一类事物有多种形态,比如动物有多种形态:人,狗,猪# 文件也有多种形态:文本文件,可执行文件'''多态性:一、什么是多态动态绑定(在继承的背景下使用时,有时也称为多态性)多态性是指在不考虑实例类型的情况下使用实例,多态性分为静态多态性和动态多态性静态多态性:如任何类型都客园用运算符+进行运算动态多态性:如下'''import abcclass Animal(metaclass=abc.ABCMeta): # 多态:同一类事物的多种形态 @abc.abstractmethod def talk(self): passclass People(Animal): def talk(self): print('say hello')class Dog(Animal): def talk(self): print('say wangwang')class Pig(Animal): def talk(self): print('say aoao')# 多态性:指的是客园在不考虑对象的类型的情况下而直接使用对象peop1 = People()dog1 = Dog()pig1 = Pig()# peop1.talk()# dog1.talk()# pig1.talk()def func(animal): animal.talk()func(peop1)func(dog1)func

C++ 常见面试题目

送分小仙女□ 提交于 2020-02-21 07:05:14
const作用 (1)可以定义const常量,具有不可变性。 (2)便于进行类型检查。(而宏不会进行类型检查)。 (3)可以保护被修饰的东西,防止意外的修改。 (4) 可以节省空间。 static作用 1.隐藏:一个文件中的全局变量在另外一个文件中使用extern声明就能使用,声明了static就不能了 一个函数内的static变量具有全局生命期,但只在这个函数中可见 2.记忆功能和全局生存期 3.默认初始化为0 4.类的静态成员函数是属于整个类而非类的对象,所以它没有this指针 5.不能将静态成员函数定义为虚函数。 6.不可以同时用const和static修饰成员函数。 什么函数不能声明为虚函数 1:只有类的成员函数才能说明为虚函数; 2:静态成员函数不能是虚函数; 3:内联函数不能为虚函数; 4:构造函数不能是虚函数; 5:析构函数可以是虚函数,而且通常声明为虚函数。 指针和引用的区别 本质上:指针是一个新的变量,只是这个变量存储的是另一个变量的地址,我们通过访问这个地址来修改变量。 而引用只是一个别名,还是变量本身。对引用进行的任何操作就是对变量本身进行操作,因此以达到修改变量的目的。 1.引用必须被初始化,指针不必 2.引用初始化以后不能被改变,指针可以改变所指的对象。 3.不存在指向空值的引用,但是存在指向空值的指针。 4."sizeof引用"得到的是所指向的变量(对象

C#中的多态性

老子叫甜甜 提交于 2020-02-21 01:38:16
连多态都理解错误了,丢脸!!!!!!! 不知道这个和接口中的方法在不同类中的的实现不一样 之区分 首先理解一下什么叫多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。 多态性通过派生类覆写基类中的虚函数型方法来实现。 多态性分为两种,一种是编译时的多态性,一种是运行时的多态性。 编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的多态性是通过覆写虚成员实现。 下面我们来分别说明一下多态中涉及到的四个概念:重载,覆写,虚方法和抽象方法。 重载和覆写的区别: 重载 类中定义的方法的不同版本 public int Calculate(int x, int y) public double Calculate(double x, double y) 特点(两必须一可以) 方法名必须相同 参数列表必须不相同 返回值类型可以不相同 覆写 子类中为满足自己的需要来重复定义某个方法的不同实现。 通过使用override关键字来实现覆写。 只有虚方法和抽象方法才能被覆写。 要求(三相同) 相同的方法名称 相同的参数列表 相同的返回值类型 例: public class Test {

封装+继承+多态

∥☆過路亽.° 提交于 2020-02-20 13:26:25
面向对象三大特性 封装: Encapsulation是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随意访问。要访问该类的代码和数据,必须通过严格的接口控制。封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。 *** 继承: 单从纵向看,子类通过继承从父类得到部分功能,实现代码和功能的复用;当多个子类继承公共父类时,如需修改公共部分代码,则只需改动父类代码,提高了代码的可维护性。 特性: 子类拥有父类非 private 的属性、方法。 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。 子类可以用自己的方式实现父类的方法。 Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差) 优点: 良好的封装能够减少耦合。 类内部的结构可以自由修改。 可以对成员变量进行更精确的控制。 隐藏信息,实现细节。 *** 多态:

Java知识串讲

蓝咒 提交于 2020-02-20 13:08:07
一、JDK个版本之间的区别: 1.JDK1.5的新特性: 泛型ArrayList list = new ArrayList();-->ArrayList<int> list = new ArrayList<int>(); 自动装箱/拆箱 for - each static import(静态导入) 以前是:Math.squrt() --》squrt(); 边长参数: int sum(int ... int list)有任意个参数,把它看做数组,通过...来表示 枚举 元数据(Meradata) 2.JDK1.6的新特性: 增强的for循环 监视器和管理:JavaSE6中内存泄漏增强了分析以及诊断能力。。当遇到java.lang.OutOfMemory异常的时候,可以得到一个完整的堆栈信息,并且当堆已经满了的时候,会产生一个Log文件记录这个致命错误,另外JVM还添加了一个选择,允许你在堆满的时候运行脚本。 插入式注解处理:插入式直接处理API(JSR 269)提供了一套标准API来处理Annotations(释文) 安全性 Desktop类和SystemTray类 使用JAXB2来实现对象域XML之间的映射 StAX 使用Compiler API 轻量级HTTPServer API 用console来发控制台程序 3.JDK1.7的新特性: 模块化特性

Java面向对象大致梳理

别说谁变了你拦得住时间么 提交于 2020-02-20 13:01:03
面向对象思想、 面向对象思想概述: Java设计语言面向对象: Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面 向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算 机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去 操作实现。 类和对象: 类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该 类事物 属性:就是该事物的状态信息。 行为:就是该事物能够做什么。 对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性 和行为。 类与对象的关系 : 类是对一类事物的描述,是抽象的。 对象是一类事物的实例,是具体的。 类是对象的模板,对象是类的实体。 面向对象之封装: 概述: 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。 封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的 方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

JAVA学习阶段总结(二)

断了今生、忘了曾经 提交于 2020-02-19 04:28:20
JAVA学习阶段总结(二) 一、简单的键盘输入和输出 二、继承的使用要点 三、方法的重写override 四、方法的重载overload 五、多态 六、Object类 七、强制类型转换 一、简单的键盘输入和输出 这里补一个很简单的知识点,直接上代码: package test ; import java . util . Scanner ; public class TestScanner { public static void main ( String [ ] args ) { Scanner scanner = new Scanner ( System . in ) ; System . out . println ( "请输入你的名字:" ) ; String name = scanner . nextLine ( ) ; System . out . println ( "请输入你的年龄:" ) ; int age = scanner . nextInt ( ) ; System . out . println ( "##############################" ) ; System . out . println ( "姓名:" + name ) ; System . out . println ( "年龄:" + age ) ; } } 二