子类在继承了父类的方法后,可以对父类已有的方法给出新的实现版本,这个动作称之为方法重写(override)。通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本,当我们调用这个经过子类重写的方法时,不同的子类对象会表现出不同的行为,这个就是多态(poly-morphism)。

多态性:用一个名字定义不同的函数,调用同一个名字函数,却执行不同操作,即一个接口,多种方法。

多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。

类的多态性:指用虚函数和延迟绑定来实现。

函数的多态性:函数的重载。

C++的多态性: 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数

存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。

纯虚函数是虚函数再加上=0。即纯虚函数virtual void breathe()=0;即抽象类、抽象方法;(告诉编译器不需要在这的类里寻找这个方法的实现)

抽象类是指包括至少一个纯虚函数的类

多态用虚函数来实现,结合动态绑定

多态实现绑定方法:

编译时的多态性:通过重载实现

运行时的多态性:通过虚函数实现

虚方法,在方法前面加virtual 。在使用new时,创建的对象被父类接收,但是创建的对象类型和父类不同。

即在运行时才分配的类型和他们在编译时的类型是不一样的。为了让编译器知道根据这两个指针在

运行时的类型而有选择地调用正确的方法(dog::play和cat::play()),我们必须把这些方法声明为虚方法

#include <iostream>
#include <string>//错误的原因:编译器编译时已经确定对象调用的函数地址,
//解决的方法(virtual):使用迟绑定(late binding)技术,编译器会在运行时再去确定对象的类型以及正确调用函数。class Pet
{
public:Pet(std::string theName);virtual void eat();virtual void sleep();virtual void play() = 0;  //注意这里 ,抽象函数使用
protected:std::string name;
};class Cat:public Pet
{
public:Cat(std::string theName);void climb();void play();  //这里对基类方法进行了覆盖,但如果上面不适用virtual,则在调用此方法时,//不会成功被调用,而是会调用基类的方法。//原因:程序编译时,编译器会检查所有的代码,在如何对某个数据进行//      处理和可以对该类型的数据进行何种处理之间寻找一个最佳点。//      cat dag 在编译时都是Pet类型指针,编译器就认为两个指针调用的//      play()是Pet::paly()方法,因为这样最快。};class Dog:public Pet
{
public:Dog(std::string theName);void bark();void play();
};Pet::Pet(std::string theName)
{name = theName;
}void Pet::eat()
{std::cout<< name <<"吃东西\n";
}void Pet::sleep()
{std::cout<<name<<"sleeping\n";
}
/* 使用了抽象方法,不必再写其实现
void Pet::play()
{std::cout<<name<<"playing\n";
}
*/Cat::Cat(std::string theName):Pet(theName)
{
}void Cat::climb()
{std::cout<<"climb";
}void Cat::play()
{std::cout<<name << "paly ball\n";
}Dog::Dog(std::string theName):Pet(theName)
{}void Dog::bark()
{std::cout<<name<<"汪\n";
}void Dog::play()
{std::cout<<name<<"追猫\n";
}int main()
{Pet *cat = new Cat("加菲"); //注意这里创建对象时使用的new,下面调用其方法时用->。而且//也是上面使用virtual的原因:使用的指针(地址),//指向了Pet的类指针。调用play时,编译时会选择最优的选择(pet中的play),指向Pet//而非cat中的play//或者以下,同样需要使用virtual//Pet ccat("加菲");//Pet *cat = &ccat;Pet *dog = new Dog("欧迪");cat->sleep();cat->eat();cat->play();dog->sleep();dog->eat();dog->play();delete cat;delete dog;return 0;
}

C++ 多态、虚函数、虚方法相关推荐

  1. 虚函数 虚继承 抽象类

    虚函数.纯虚函数.虚基类.抽象类.虚函数继承.虚继承 虚函数:虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.是C++中多态性的一个重要体现, ...

  2. 38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】

    虚函数.虚基类.纯虚函数 (一).虚函数 1.什么是虚函数: 2.虚函数的格式: 3.关于虚函数的注意事项: 4.虚函数的作用: 5.虚函数访问格式 6.虚函数的各种疑难杂症 [当指针是基类.但虚函数 ...

  3. 【C++】多态 - 虚函数/虚析构函数以及虚函数表

    什么是多态: 指不同对象收到相同消息时或相同对象收到不同消息时产生不同的动作. 这里先说下为什么会用到虚函数: 以下面的程序为例: 这个程序中,Carp是Fish的继承类,而Carp中覆盖了Swim这 ...

  4. 图解C++虚函数 虚函数表

    图解C++虚函数 2016年07月02日 17:47:17 海枫 阅读数:5181 标签: 虚函数c++g++对象模型C++虚函数更多 个人分类: C/C++/linux 版权声明:本文为博主原创文章 ...

  5. c语言中虚函数和纯虚函数,虚函数和纯虚函数的区别是什么?

    虚函数和纯虚函数的区别:1.纯虚函数只有定义,没有实现:而虚函数既有定义,也有实现的代码.2.包含纯虚函数的类不能定义其对象,而包含虚函数的则可以. 相关推荐:<C++视频教程> 虚函数( ...

  6. 虚函数 纯虚函数 虚基类说明

    原文:http://www.cnblogs.com/ms-frank/archive/2008/01/16/1041310.html 虚基类 在说明其作用前先看一段代码 [cpp] view plai ...

  7. Cpp 对象模型探索 / 外部调用私有的虚函数的方法

    答案 通过虚函数表指针找到虚函数表,再通过虚函数表中的元素,即:函数指针,得到私有函数的首地址. 示例 #include <iostream>class A { private:virtu ...

  8. 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )

    文章目录 类的继承 方法的重写 子类中调用父类方法 多态 虚函数 虚函数示例 纯虚函数 相关代码 类的继承 1. 继承表示 : C++ 中继承可以使用 ":" 符号 , 格式为 & ...

  9. 复习笔记(五)——C++多态和虚函数

    静态绑定与动态绑定 静态绑定: -编译时就能确定一条函数调用语句要调用的函数 -在程序编译时多态性体现在函数和运算符的重载上 动态绑定: -运行时才能确定函数调用语句调用的函数 -程序运行时的多态性通 ...

  10. c++远征之多态篇——虚函数及其实现原理

    以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.多态的定义 简单理解,就是对于同一条命令,不同对象会做出不同的操作. 相同对象收到不同消息,或者不同对象收到相同消息时,产生不同的动作. 2. ...

最新文章

  1. cxgrid中纵横单元格合并_被合并单元格折磨疯的我,真后悔没早点知道这个Excel技巧!...
  2. 如果有一天程序员再也不忙了
  3. 报名 | 加密金融生态大咖私享会
  4. 一个包从服务器到达客户端
  5. bash: make: command not found - 解决办法
  6. c中嵌入Python,提供灵活性
  7. java 22 - 8 多线程之线程生命周期图解
  8. 解决ionic3 android 运行出现Application Error - The connection to the server was unsuccessful
  9. [Leedcode][JAVA][第41题][缺失的第一个正数][哈希表][数组]
  10. 蓝桥杯大赛基础之--数列排序
  11. ubuntu16.04 下ROS操作系统学习笔记(一)ROS-kinetic安装
  12. 20155313 杨瀚 《网络对抗技术》实验八 Web基础
  13. getting start with storm 翻译 第六章 part-4
  14. Eclipse的环境设置
  15. GB与CE标准对照表-转载
  16. MSN 通信协议学习笔记(转)
  17. 银行业数据安全建设要点分析2022
  18. win7计算机系统减肥,怎样给win7瘦身 win7瘦身攻略
  19. SAMA5D3X-EK 嵌入式linux内核编译启动及通过nfs通过网络启动文件系统及文件系统镜像的制作
  20. Android设备获取mp3中的专辑封面信息

热门文章

  1. 轻松拆书,制作思维导图:ChatGPT一键生成
  2. C#使用WebService调用海康SDK实现抓图与录像实时下载
  3. 米哈游2020春招笔试题总结
  4. 联通4g测试软件,用联通4G的手机更费电?测试证实比移动4G狠
  5. 模拟音乐 app 的 Now Playing 动画
  6. 如何用开源组件“攒”出一个大数据建模平台?
  7. 数据分析师对标签、指标、维度、字段等的思考(指标体系标签体系(转自知乎)
  8. webRtc播放rtsp视频流(vue2、vue3+vite+ts)
  9. 微信小程序Swiper标签
  10. 用Python更加了解微信好友