1,函数重写回顾:

1,父类中被重写的函数依然会继承给子类;

2,子类中重写的函数将覆盖父类中的函数;

1,重写父类当中提供的函数是因为父类当中提供的这个函数版本不能满足我们的需求,因此我们要重写;

2,期望只要是子类对象,则调用子类当中的版本,而不是父类当中定义的函数版本;

3,通过作用域分辨符(::)可以访问到父类中的函数;

1,代码示例:

Child c;
Parent* p = &c; c.Parent::print(); // 从父类中继承;I'm Parent.
c.print(); // 在子类中重写;I'm Child. p->print(); // 父类中定义;I'm Parent.不是我们期望的版本,因为 p 指向了子类对象,期望调用子类版本

2,面相对象中期望的行为:

1,根据实际的对象类型判断如何调用重写函数;

1,而不是根据指针类型(编译器默认的安全行为);

2,父类指针(引用)指向:

1,父类对象,则调用父类中定义的函数;

2,子类对象,则调用子类中定义的重写函数;

3,面向对象中的多态的概念:

1,根据实际的对象类型决定函数调用的具体目标;

1,相同的行为方式可能导致不同的行为结果,即产生了多种形态行为,即多态;

2,同样的调用语句在实际运行时有多种不同的表现形态;

1,同一行语句展现了多种不同的表现形态,多态本质;

4,C++ 语言直接支持多态的概念:

1,通过使用 virtual 关键字对多态进行支持;

1,什么时候用 virtual ?

2,定义类的时候,觉得某一个函数在后续被继承的过程当中,有可能被重写,就是用 virtual 关键字修饰这个函数;

2,被 virtual 声明的函数被重写后具有多态特性;

1,函数名和参数都必须一样,若函数名相同但参数不同,这是同名覆盖;

3,被 virtual 声明的函数叫做虚函数(因为 virtual 的意思就是虚拟的);

1,虚函数被继承后依然是虚函数,不用再被 virtual 修饰;

5,多态的初体验编程实验:

 #include <iostream>
#include <string> using namespace std; class Parent
{
public:
virtual void print() // 这个函数可能被继承的子类重写,所以加上virtual 关键字来修饰它,称为虚函数,实现多态;
{
cout << "I'm Parent." << endl;
}
}; class Child : public Parent
{
public:
void print() // 虽然没有写 virtual 关键字,但是由于继承的关系,它就是虚函数;一般工程中没必要在子类中写 virtual;
{
cout << "I'm Child." << endl;
}
}; void how_to_print(Parent* p)
{
p->print(); // 希望展现多态行为;
} int main()
{
Parent p;
Child c; how_to_print(&p); // 期望打印: I'm Parent. 实际打印:I'm Parent.
how_to_print(&c); // 期望打印: I'm Child. 实际打印:I'm Child. return ;
}

6,多态意义:

1,在程序运行过程中展现出动态的特性;

1,编译时无法决定究竟调用哪一个版本的实现;

2,函数重写必须多态实现,否则没有意义;

1, C++ 后续语言(Java、C#)中,只要是重写,一定是虚函数,不需要显示声明 virtual 关键字;

3,多态是面向对象组件化程序设计的基础特性;

1,后续学习中多态特性会被变着花样玩儿,特别是设计模式中绝大多数模式都和多态相关;

7,理论中的概念:

1,静态联编:

1,在程序的编译期间就能确定具体的函数调用;

1,如函数重载;

2,动态联编(多态):

1,在程序实际运行后才能确定具体的函数调用;

1,如函数重写;

8,动态联编与静态联编实例分析:

 #include <iostream>
#include <string> using namespace std; class Parent
{
public:
virtual void func()
{
cout << "void func()" << endl;
} virtual void func(int i)
{
cout << "void func(int i) : " << i << endl;
} virtual void func(int i, int j)
{
cout << "void func(int i, int j) : " << "(" << i << ", " << j << ")" << endl;
}
}; class Child : public Parent
{
public:
void func(int i, int j)
{
cout << "void func(int i, int j) : " << i + j << endl;
} void func(int i, int j, int k) // 子类同名覆盖父类当中的函数,重载同一作用域当中的函数;
{
cout << "void func(int i, int j, int k) : " << i + j + k << endl;
}
}; void run(Parent* p)
{
p->func(, ); // 展现多态的特性,动态联编
} int main()
{
Parent p; p.func(); // 静态联编
p.func(); // 静态联编
p.func(, ); // 静态联编 cout << endl; Child c; c.func(, ); // 静态联编 cout << endl; run(&p);
run(&c); return ;
}

9,多态编程实验:

 #include <iostream>
#include <string> using namespace std; class Boss
{
public:
int fight()
{
int ret = ; cout << "Boss::fight() : " << ret << endl; return ret;
}
}; class Master
{
public:
virtual int eightSwordKill()
{
int ret = ; cout << "Master::eightSwordKill() : " << ret << endl; return ret;
}
}; class NewMaster : public Master
{
public:
int eightSwordKill() // 重写八剑齐飞
{
int ret = Master::eightSwordKill() * ; cout << "NewMaster::eightSwordKill() : " << ret << endl; return ret;
}
}; void field_pk(Master* master, Boss* boss)
{
int k = master->eightSwordKill(); // 赋值兼容性加上函数重载,根据实际的对象调用函数;
int b = boss->fight(); if( k < b )
{
cout << "Master is killed..." << endl;
}
else
{
cout << "Boss is killed..." << endl;
}
} int main()
{
Master master;
Boss boss; cout << "Master vs Boss" << endl; field_pk(&master, &boss); cout << "NewMaster vs Boss" << endl; NewMaster newMaster; field_pk(&newMaster, &boss); return ;
}

10,小结:

1,函数重写只可能发生在父类与子类之间;

2,根据实际对象的类型确定调用的具体函数;

3,virtual 关键字是 C++ 中支持多态的唯一方式;

4,被重写的虚函数课表现出多态的特性;

5,虚函数和多态的关系:

1,多态是面向对象理论当中的一个概念,它和具体的程序设计语言是没有关系的,也就是说多态指的仅仅是相同的行为方式,不同的行为结果;

2,这种多态的表现形式在 C++ 中由虚函数来实现;

C++中多态的概念和意义的更多相关文章

  1. java中多态的概念

    概念: 简答来说,多态(Polymorphism)是具有表现多种形态的能力的特征.    更专业的说法是:同一个实现接口,使用不同的实例而执行不同的操作. 好处: 通过多态可以减少类中代码量,可以提高 ...

  2. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  3. 个人对Java中多态的一些简单理解

    什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...

  4. Java中多态的一些简单理解

    什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...

  5. 『Python题库 - 简答题』 Python中的基本概念 (121道)

    ## 『Python题库 - 简答题』 Python中的基本概念 1. Python和Java.PHP.C.C#.C++等其他语言的对比? 2. 简述解释型和编译型编程语言? 3. 代码中要修改不可变 ...

  6. Javase中多态polymorphic的简单介绍

    -------------多态-----------------  (1)面向对象三大核心思想:    1.封装 2.继承 3.多态 (2)多态定义:父类的引用指向子类的对象.   (3)引用指的是父 ...

  7. Mycat中的核心概念

      Mycat中的核心概念     Mycat中的核心概念 1.数据库中间件    Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...

  8. 从虚拟机指令执行的角度分析JAVA中多态的实现原理

    从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...

  9. java中多态的实现机制

    多态的概念: 简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象.程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法. 多态存在的前 ...

随机推荐

  1. C# 1.0(2002)

    序言 C# 1可以看做2001年Java语言的升级版. 主要功能 类 结构 接口 事件 属性 委托 表达式 语句 特性 值类型和引用类型 装箱和拆箱 资料

  2. BZOJ 1212: [HNOI2004]L语言 trie

    长度小于 10 是关键信息~ #include <cstdio> #include <cstring> #include <algorithm> #define N ...

  3. sh_02_del关键字

    sh_02_del关键字 name_list = ["张三", "李四", "王五"] # (知道)使用 del 关键字(delete)删除 ...

  4. 在vue项目中添加一个html页面,开启本地服务器

    在vue项目里新增一个不需要登录的页面,那么我只能新增一个html页面了,不经过路由,直接在浏览器输入路径打开,那么就需要用到本地服务器, 1.vue里面的html页面最好放过在public文件夹里面 ...

  5. HDU4587--TWO NODES(无向图割点,暴力出奇迹)这是我见过的时间最长的题。。。

    TWO NODES Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  6. AcWing:105. 七夕祭(前缀和 + 中位数 + 分治 + 贪心)

    七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11 ...

  7. DVWA--File Inclusion

    0x01了解什么叫file inclusion File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(incl ...

  8. 【转】Java操作CSV文件导入导出

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  9. 二、linux下apache2.2.11+php5.6.3的环境配置

    参考文献:http://www.92csz.com/study/linux/16.htm 本节部分操作会直接使用上一节(http://www.cnblogs.com/yxpblog/p/4627509 ...

  10. EBS 显示主页面的工作列表和主菜单

    EBS环境: R12.1.3 问题描述:如果系统的“个性化页”做了设置,可能出现登录系统后,如果下图红框中的 主菜单和工作列表没有显示的情况,如果需要重新显示“主菜单”和“工作列表”,可参考以下操作 ...