多态

1.6 C++学习之多态&虚函数&文件操作

回眸只為那壹抹淺笑 提交于 2019-12-02 15:11:07
文章目录 多态 基本概念 多态原理 实例:计算器类 纯虚函数和抽象类 实例:制作饮品 虚析构和纯虚析构 案例:电脑组装 文件操作 文本文件 写文件 读文件 二进制文件 写文件 读文件 多态 基本概念 多态是面向对象三大特性之一 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名 动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 - 编译阶段确定函数地址 动态多态的函数地址晚绑定 - 运行阶段确定函数地址 class Animal { public: //Speak函数就是虚函数 //函数前面加上virtual关键字,变成虚函数,那么编译时不能确定函数调用了,运行时才确定 virtual void speak() { cout << "动物在说话" << endl; } }; class Cat :public Animal { public: void speak() { cout << "小猫在说话" << endl; } }; class Dog :public Animal { public: void speak() { cout << "小狗在说话" << endl; } }; //我们希望传入什么对象,那么就调用什么对象的函数 //如果函数地址在编译阶段就能确定,那么地址早绑定,即静态联编 /

Java多态

南笙酒味 提交于 2019-12-02 15:08:37
我们学习多态一定要明确下面这几点注意事项 ※什么是多态 多态就是对同一个对象,在不同时刻表现出来的不同形态 ※多态的前提条件有哪些 要有继承/实现关系 要有方法重写 要有父类引用指向子类对象 ※ 多态的成员特点是什么 成员变量:编译看左边、运行看左边 成员方法:编译看左边、运行看右边 比如:猫和狗它们都属于"动物类",并且它们"共同的特点"就是睡觉,每个物种都有属于自己的方法 接下来我们用代码来实现: ① 首先我们创建一个动物类,这个动物类也就是所说的父类 动物共同的特点就是"吃",所以说我们在这里写了一个吃的方法 public class Animal { public void eat(){ System.out.println(“吃东西”); } } ②定义一个Cat猫类,这个也就是子类,所以说我们要用到关键词extends, 猫类继承动物类,都有eat 猫也有自己的特点就是抓老鼠,所以说我在这里也写了一个抓老鼠的方法 public class Cat extends Animal{ @Override public void eat() { System.out.println(“猫吃鱼”); } //自己独有的方法 public void zhua(){ System.out.println(“猫抓老鼠”); } } ③定义一个Dog狗类,这个也是子类

《C++ 习题与解析》笔记

人盡茶涼 提交于 2019-12-02 14:53:46
目录 ####Chapter-1 C++语言概述(错题) ####Chapter-2 类和对象 ####Chapter-3 引用 ####Chapter-4 友元函数 #### Chapter-5 运算符重载 #### Chapter-6 继承与派生(错题) #### Chapter-7 多态性和虚函数 #### Chapter-8 异常处理 C++基础: 基础数据类型,简单输入输出,流程控制语句,函数与编译预处理,数组,结构体,指针与引用 C++面向对象部分: 类与对象,构造和析构函数,继承与派生,友元,虚函数,静态成员,运算符重载 Chapter-1 C++语言概述 位运算操作符 单目:~(按位求反) 双目:&(与)、 |(或)、 ^(按位异或) 移位运算符 << (左移): 左移是将一个二进制数按指定的位数向左移位,移掉的位被丢弃,右边移出的空位一律补0 >> (右移): 右移是将一个二进制数按指定的位数向右移位,移掉的位被丢弃,左边移出的空位一律补0,或补符号位 逗号运算符 d1, d2, d3, d4: 计算一个逗号表达式的值时,从左至右依次计算各个表达式的值,最后计算的一个表达式的值和类型便是整个逗号表达式的值和类型 二维数组指针表示 //输出对应的值的三种方法 int b[2][3]; a. *(*(b+i)+j) b. *(b[i]+j) c. *(&b[0][0]

【Java】第八节 多态

旧城冷巷雨未停 提交于 2019-12-02 14:53:31
Java引用变量有两种类型,分别是编译时类型和运行时类型:编译时类型由声明该变量时使用的类型决定;运行时类型由实际赋给该变量的对象。如果编译时类型和运行时类型不一致,就可能出现所谓多态。 如果子类没有重写父类的方法或者没有调用重写的方法,那么不会出现多态。 出现多态的条件有三个:继承、重写、调用 多态:多态是一种现象,描述的是父类类型的变量指向子类的实例化对象,在调用父类中被子类重写的方法时,在编译时指向的是父类中被子类重写的方法,而在运行时则指向子类中重写父类的方法,例: class Animal { public void howl ( ) { System . out . println ( "动物吼叫。。。" ) ; } } class Dog extends Animal { @Override public void howl ( ) { System . out . println ( "汪汪汪汪。。。" ) ; } } public class Test { public static void main ( String [ ] args ) { Animal dog = new Dog ( ) ; dog . howl ( ) ; //运行结果:汪汪汪汪。。。 } } 因为变量dog的类型是Animal类,在编译时不会创建对象,因此使用变量dog调用的howl(

C++虚函数详解

…衆ロ難τιáo~ 提交于 2019-12-02 14:34:47
转自: c++虚函数 大牛的文章,就是通俗易懂,言简意赅。 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。 当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没有详细的说明,没有比较,没有举一反三。不利于学习和阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见。 言归正传,让我们一起进入虚函数的世界。 虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候

Java之路---Day12(多态)

混江龙づ霸主 提交于 2019-12-02 13:18:00
2019-10-26-22:40:09 目录:    1.多态的概念    2.多态的分类    3.实现多态的三个必要条件    4.多态的格式    5.多态成员变量的使用特点    6.多态成员方法的使用特点    7.多态的好处    8.多态的向上和向下转型 1.多态的概念:   多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义 2.多态的分类:   编译时多态(静态):主要是指方法的重载,它是根据参数列表的不同来区分不同的方法   运行时多态(动态):它是通过动态绑定来实现的,也就是大家通常所说的多态性。 3.实现多态的三个必要条件:   1. 继承:在多态中必须存在有继承关系的子类和父类。   2.重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。   3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。 1 package demosummary.polymorphic; 2 3 public class Fu { 4 //定义两个变量 5 double d1; 6 double d2; 7 8 //无参构造 9 public Fu() { 10 }

重载与多态

…衆ロ難τιáo~ 提交于 2019-12-02 13:07:53
多态的类型 :分为4类,重载多态,强制多态,包含多态,参数多态。 以前所学过的普通函数的重载也属于重载多态。强制多态是指将一个变元的类型加以变化,以符合一个函数或操作的要求,比如int型与float型相加,要先进行类型转换。 多态的实现 :分为两类,编译时的多态与运行时的多态。 前者在编译的过程中确定了同名的具体操作对象,而后者是在程序运行过程中才多态地确定操作所指向的对象。这种确定操作具体对象的过程就是绑定。绑定工作在编译连接阶段完成的情况为 静态绑定 ,在程序运行过程中完成的情况是 动态绑定 。 运算符重载 运算符重载时对已有的运算符赋予多重含义,使同一个运算符作用于不同的数据类型时有不同的行为。 重载形式 重载为类的非静态成员函数,重载为非成员函数。 两种重载方式的声明语法形式一般相同 都为 返回类型 operator 运算符(形参表) { 函数体 } 非成员函数一般定义为友元函数。 **实现‘+’的重载** #include<iostream> using namespace std; class counter { private: float a; public: counter(float a=0):a(a){} counter operator+(counter& c)const { **//定义为类的非静态成员函数** return counter(a + c.a

JavaSE学习08(抽象类和接口)

只愿长相守 提交于 2019-12-02 12:48:12
抽象类 1.抽象类描述 在java中,一个没有方法体的方法应该定义为抽象方法,包含该方法的类必须定义为抽象类。 2.抽象类的特点 抽象类和抽象方法必须用abstract关键字修饰。 public abstract class 类名 {} public abstract void eat(){}; 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。 抽象类不能示例化 抽象类要参照多态的方式,通过子类对象示例化,这叫抽象类多态。 抽象类的子类 要么重写抽象类中的所有抽象方法 要么子类是抽象类。 3.抽象类的成员特点 成员变量: 可以是变量也可以是常量 构造方法: 有构造方法,但是不能示例化,主要用于子类访问父类数据的初始化。 成员方法: 可以有抽象方法,限定子类必须完成某些动作,也可以有非抽象方法,提高代码复用性。 接口 1.接口概述 接口就是一种公共的规范标准,只要符合规范标准,大家都可以使用。 Java中的接口主要体现在 对行为的抽象 2.接口的特点 接口用关键字interface 修饰 public interface 接口名{} 类实现接口用implements表示, public class 类名implements 接口名{} 接口不能示例化 接口可以参照多态的方式,通过实现类对象实力化,这叫接口多态。 多态的形式: 具体类多态(不怎么使用)、抽象类多态、接口多态。

多态性总结

青春壹個敷衍的年華 提交于 2019-12-02 12:47:41
  多态从实现的角度可以划分为:编译时多态和运行时的多态。 运算符重载   运算符重载即静态多态,是对已有的运算符赋予多重含义,运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字 operator 和其后要重载的运算符符号构成的。把指定的运算表达式转化为对运算符函数的调用,运用对象转化为运算符函数的实参。 • 运算符重载格式 函数类型 operator运算符 (形参){ …… } • 运算符重载规则 当重载为类的成员函数的情况,形式参数个数=原操作数个数-1(后置++、--除外)。 当重载为类友元函数的情况,形式参数个数=原操作数个数。 除了类属关系运算符 "." 、成员指针运算符 ".*" 、作用域运算符 "::" 、sizeof 运算符和三目运算符 "?:" 以外,C++ 中的所有运算符都可以重载。 重载运算符限制在 C++ 语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。 //复数类成员函数自增 #include<iostream> using namespace std; class complex{ private: int real,imag; public: complex(int r,int i){ real=r; imag=i; }

C++多态小结

眉间皱痕 提交于 2019-12-02 12:34:52
C++ 多态 多态 多态 按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 多态与非多态的实质区别就是函数地址是早绑定还是晚绑定 。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。 下面的实例中,基类 Shape 被派生为两个类,如下所示: #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a=0, int b=0){ width = a; height = b; } int area(){ cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape{ public: Rectangle( int a=0, int b=0):Shape(a, b) {} int area (){ cout << "Rectangle class area :" <<endl; return