1、虚函数

在c++中,可以调用虚函数来实现运行时的多态性,,这样可以进行函数的重载

虚函数的定义是在基类中进行的,,当吧基类中的某一个成员函数定义成虚函数之后,就可以在派生类中重新定义,

在派生类重新定义的时候,函数的原型包含函数参数,函数名,参数的个数和类型,以及参数的顺序都必须和基类中的函数一样

虚函数的定义形式:

virtual <函数类型》《函数名》(参数表)

{

函数体

}

该函数定义一个虚函数,在派生类总继承基类,对虚函数重新的定义

<span style="font-size:18px;">#include<iostream>
using namespace std;
class animal
{
public:void sleep(){cout << "animal is sleeping" << endl;}virtual void breath(){cout << "aniaml is breathing" << endl;}
};
class fish :public animal
{
public:void breath(){cout << "fish is breathing" << endl;}
};int main()
{animal an;an.breath();fish fh;fh.breath();animal *ann = &fh;ann->breath();system("pause");return 0;}</span>

在基类函数中间virtual关键字 后,当基类对象的指针指向fish类的对象时,会调用fish类中的函数,得到预期的效果

当基类的成员函数breath()函数定义为虚函数时,编译器为每个包含虚函数的类创建一个虚表

类aniaml的虚表: &animal::breath()---------------------->animal::breath()

类fish的虚表:&fish::reath()-------------------------------->fish::brath()

当使用fish类的fh对象狗仔完后,,其内部的虚表指针按初始化指向fish类的虚表,

当进行类型转换后,调用ann-》breath()函数,由于ann实际指向的是fish对象,该对象内部的虚表指针指向的是fishle类的

虚表,最终调用fish类的breath()函数

在调用虚函数注意:

1、虚函数只能定义在基类中

2、重载的函数,要求函数名、返回类型、参数个数、参数类型和参数顺序必须和基类中的函数一样

3、在用基类对象访问重载函数时,需用指针进行调用

2、多级继承和虚函数

多级继承可以看作多个继承的组合,多级继承的虚函数和单继承的而虚函数相同,一个虚函数无论被继承多少次,仍然保持虚函数的特性,与继承次数无关

例子:

#include<iostream>
using namespace std;
class base
{
public:virtual ~base(){};virtual void func(){cout << "base output" << endl;}
};
class derive1 :public base
{
public:void func(){cout << "derive1 output" << endl;}
};
class derive2 :public derive1
{void func(){cout << "derive2 output" << endl;}
};void test(base &b)
{b.func();
}
int main()
{base bob;derive1 dob1;derive2 dob2;test(bob);test(dob1);test(dob2);system("pause");return 0;
}

面向对象的多态性(2)相关推荐

  1. JAVA:使用面向对象的多态性模仿会员卡消费系统,设计会员卡类,可派生不同的会员卡类型,当使用不同的会员卡消费时其折扣不同。

    使用面向对象的多态性模仿会员卡消费系统,设计会员卡类,可派生不同的会员卡类型,当使用不同的会员卡消费时其折扣不同.如一般会员卡消费打9折:VIP会员卡打7折:超级VIP卡打5折.其具体的实现效果如下所 ...

  2. 面向对象的多态性(1)

    1.多态性具体来说:就是同一个函数名称,作用在不同的对象产生不同的 ,主要针对的是基类和多个派生类之间的关系 例子: #include<iostream> using namespace ...

  3. 面向对象之多态性(基类引用可以指向子类)

    1.派生类的对象和基类是属于的关系,即 对象 is a X类,对象属于X类. 2.多态性的概念: 了解多态性之前,要熟悉引用和对象的区别: 对象存储在堆中,引用(符)存储在栈中,引用符的值是对象在堆中 ...

  4. 面向对象的特性(面向对象的多态性:转型,重载与重写)

    对于面向对象的特性,一般有两种说法:一种是三大特性,分别是封装,继承,多态,另外一种是封装,继承,多态,抽象:需要注意的是:这是面向对象的特性,不是java的特性(面向对象): 多态:多态是面向对象很 ...

  5. 面向对象的多态性(3)

    1.纯虚函数 当在基类中不能为虚函数给出一个有意义的实现时(就是没定义函数体中的具体内容),可以声明为纯虚函数,纯虚函数可以交给派生类来完成, 纯虚函数的作用只是为派生类提供一个一致的借口,,, 纯虚 ...

  6. java 面向对象的多态性——向上转型与向下转型

    目录 类定义了之后需要被调用定义对象才能执行. 在前几篇中讨论了抽象类和接口,其中抽象方法是对这样的动作的抽象描述:动作名称相同,但不同类别具体执行动作的内容不同. 如:人类有"工作&quo ...

  7. 面向对象方法综述(工具<方法<思维<价值观)

    思想起源于上世纪六十年代(和结构化方法一样) 最早的OOPL:Simula67 最纯的OOPL:Smalltalk smalltalk的贡献:它在系统设计中强调对象概念的统一,引入对象,对象类,方法, ...

  8. java第四节 类的继承/抽象/接口/多态性

    /* 类的继承 类的继承可以简化类的定义 java只支持单继承,不允许多重继承 可以有多层继承,即一个类可以继承其一个类的子类,如类B继承了类A,类C又可以继承类B 那么类C也间接继承了类A子类继承父 ...

  9. C++中多态性学习(上)

    多态性学习(上) 什么是多态? 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数.虽然这看上去好像很高级的样子 ...

最新文章

  1. 内存管理之程序内存分布
  2. Objective-C中.h、.m、.mm的区别
  3. java线程暂停_Java之线程停止
  4. html5列表菜单特效,HTML5 SVG汉堡包菜单按钮分段动画特效
  5. 一起学习C语言:初谈指针(一)
  6. 小功能--扫描二维码自动连接WiFi
  7. STAR法则的理解及事例
  8. Word文档标题编号调整
  9. knn.predict()报错 Expected 2D array, got 1D array instead: array=[18 90]. Reshape your data either usi
  10. IDDD 实现领域驱动设计-SOA、REST 和六边形架构
  11. 【ACCV2022】论文阅读笔记Lightweight Alpha Matting Network Using Distillation-Based Channel Pruning
  12. 开涛的博客—公众号:kaitao-1234567,一如既往的干货分享
  13. 2020计算机科学第五轮评估,第五轮学科评估启动,这些非“双一流”建设高校可能获得A+学科...
  14. 复合型人才八种能力_我国一流大学人才培养目标的特点与问题
  15. dex字符串解密_某Xposed微信群发工具dex解密分析
  16. 一个五年架构师凭什么基本年薪酬就可以达到50万
  17. 京淘商城后台管理系统
  18. Link/Cut Tree学习笔记
  19. java简单爬虫实现打印小说章节至控制台
  20. “复制”马斯克(三):我们要为他的“反智事业”买单吗?

热门文章

  1. Python基础教程第1章:基础知识---学习记录
  2. SD卡驱动分析(二)
  3. python 下载网页文件_『如何用python把网页上的文本内容保存下来』python爬取网页内容教程...
  4. 第 3 章 Keystone - 018 - 理解 Keystone 核心概念
  5. Java的新项目学成在线笔记-day12(六)
  6. 图像理解之物体检测object detection,模型rcnn/fastrcnn/fasterrcnn原理及概念
  7. [BZOJ 4819] [SDOI 2017] 新生舞会
  8. p2596 书架(Treap)
  9. 前端将数据转化为弹幕效果的实现方式
  10. 类的属性、类的方法、类的内置方法