017_linuxC++之_多态的引入
多态:一种接口,多种方法(同一种调用方法,根据不同的对象,调用不同类中的函数)
静态联编:非虚函数,在编译时确定好
动态联编: 1. 对象里有指针,指向虚函数表
2. 通过指针,找到表,调用虚函数
3. 图二
4. virtual来定义为虚函数
(一)首先我们来看静态联编,非多态的程序
#include <iostream>
#include <string.h>
#include <unistd.h> using namespace std; class Human {
public:
void eating(void) { cout<<"use hand to eat"<<endl; }
}; class Englishman : public Human {
public:
void eating(void) { cout<<"use knife to eat"<<endl; }
}; class Chinese : public Human {
public:
void eating(void) { cout<<"use chopsticks to eat"<<endl; }
}; void test_eating(Human& h)
{
h.eating();
} int main(int argc, char **argv)
{
Human h;
Englishman e;
Chinese c; test_eating(h);
test_eating(e);
test_eating(c); return ;
}
运行结果,调用的全部是Human中的,并不是我们想要的,因为这里是静态编译进去了,也就是说程序在编译时候就已经确定好就调用Human中的
(二)动态编译,实现多态,在类中定义时候增加virtual来实现这个函数为虚函数
#include <iostream>
#include <string.h>
#include <unistd.h> using namespace std; class Human {
public:
virtual void eating(void) { cout<<"use hand to eat"<<endl; }
}; class Englishman : public Human {
public:
virtual void eating(void) { cout<<"use knife to eat"<<endl; }
}; class Chinese : public Human {
public:
virtual void eating(void) { cout<<"use chopsticks to eat"<<endl; }
}; void test_eating(Human& h)
{
h.eating();
} int main(int argc, char **argv)
{
Human h;
Englishman e;
Chinese c; test_eating(h);
test_eating(e);
test_eating(c); return ;
}
运行结果,就实现了同一接口,不同调用的方法了
(三)更多具体的,,,,,,,
017_linuxC++之_多态的引入的更多相关文章
- 自学Python5.6-面向对象三大基本特征_多态
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- Java学习笔记:03面向对象-接口_多态
1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...
- luogg_java学习_07_抽象类_接口_多态学习总结
这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 抽象 一种专门用来做父类,被继承的. (模板) 格式: abs ...
- No2_3.接口继承多态_Java学习笔记_多态
***多态***1.多态性:通常使用方法的重载(Overloading)和重写(Overriding)实现类的多态:2.重写之所以具有多态性,是因为父类的方法在子类中被重写,方法名相同,实现功能不同. ...
- 【Java基础】【09面向对象_多态&抽象类&接口】
09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案 ...
- python 入门基础21 --面向对象_多态、内置方法、反射
内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...
- Java之旅_面向对象_多态
参考并摘自:http://www.runoob.com/java/java-polymorphism.html 多态 多态是一个行为具有多个不同表现形式的能力. 多态就是同一个接口,使用不同的实例而执 ...
- CPP_封装_继承_多态
类的三方法:封装,继承,多态.封装:使用一整套方法去创建一个新的类型,这叫类的封装.继承:从一个现有的类型基础上,稍作改动,得到一个新的类型的方法,叫类的继承.多态:当有几个不同的子类对象时,对象调用 ...
- Java面向对象理解_代码块_继承_多态_抽象_接口
面线对象: /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生 ...
随机推荐
- (二)mybatis框架原理(图解)
目录 mybatis 框架原理图(粗略版) mybatis 框架原理图(粗略版)
- A司入职面试宝典
=公司介绍============================= 世界500强,每股股票2000刀. 面试难度:**** 加班程度:* =面试-流程介绍====================== ...
- 剑指offer38:输入一棵二叉树,求该树的深度
1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择 ...
- 剑指offer12:求解double类型的浮点数base和int类型的整数exponent的次方。 保证base和exponent不同时为0
1. 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.保证base和exponent不同时为0. 2. 思路和方法 分析: 由于 ...
- fontmin字体子集
怕忘了做个记录 链接:http://ecomfe.github.io/fontmin/#feature 特点:方便,快捷.
- Devexpress WinForm GridControl实现单元格可编辑状态更改
之前做项目的时候,需要实现这样的功能.在gridcontrol中,根据是否修改(checkbox)列的选中和未选中状态来联动另外一列的编辑状态.实现如下: private void gridView1 ...
- SQL Server循环插入
一个SQL循环插入的代码,运行正常: BEGIN DECLARE @idx AS INT; DECLARE @NodeName nvarchar(255); DECLARE @OtherName nv ...
- Python 正则表达模块详解
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- luogu4777[模板]拓展中国剩余定理题解
题目链接 https://www.luogu.org/problemnew/show/P4777 分析 扩展\(CRT\)就是解决模数不互质的情况,说是扩展\(CRT\),其实都是扩欧... 先来考虑 ...
- ES6的拓展
1.String的拓展 ① str.includes("abc"); ② str.startWith("abc"); ③ str.endWith("a ...