【C++札记】多态
C++中多态是面向对象设计思想的重要特性,同名具有不同功能函数,该函数调用过程执行不同的功能。多态的原理是通过一张虚函数表(Virtual Table)实现的。动多态会牺牲一些空间和效率来最终实现动态绑定。
静多态
函数重载为静多态,绑定发生在编译期间,根据函数的参数来确定调用哪个函数。
#include <iostream>
using namespace std;
void foo(int a, int b)
{
cout << "foo(int a, int b)" << endl;
}
void foo(double a, double b)
{
cout << "foo(float a, float b)" << endl;
}
int main()
{
foo(1, 2);
foo(1.1, 2.2);
return 0;
}
动多态
动多态不是在编译阶段决定的,而是在程序运行时根据基类的指针(引用)指向的对象来决定调用哪个类的虚函数。
动多态实现的条件:
1.基类中有虚函数。
2.派生类中重写基类中的虚函数。
3.父类的指针指向子类对象,调用共用的接口。
虚函数使用格式:
class 类名
{
virtual 函数声明;
};
#include <iostream>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "Animal()" << endl;
}
virtual void eating()
{
cout << "animal is eating!" << endl;
}
virtual ~Animal() //虚析构,保证析构完全
{
cout << "~Animal()" << endl;
}
};
class Dog:public Animal
{
public:
Dog()
{
cout << "Dog()" << endl;
}
void eating()
{
cout << "Dog is eating!" << endl;
}
~Dog()
{
cout << "~Dog()" <<endl;
}
};
int main()
{
Animal *ani = new Dog;
ani->eating();
delete ani;
return 0;
}
注意:含有虚函数的类,析构函数也要声明为虚函数,为虚析构函数。如果上代码virtual ~Animal()改为~Animal(),运行结果如下:
明显析构不完全,虚析构可以调用派生类的析构函数,保证了完整析构。
纯虚函数
纯虚函数时在基类中声明的虚函数,没有实现体,在函数原型后加“=0”,使用格式:
class 类名
{
virtual 函数声明 = 0;
};
1.含有纯虚函数的类称为纯虚基类,又称抽象基类(Abstract Base Class),抽象类不能进行实例化,可以继承,提供类的公共接口,在派生类中实现,类似java中Interface。
2.如果基类中声明了纯虚函数,派生类中没有实现该方法,则在派生类中仍然为纯虚函数,该派生类仍为纯虚基类。
#include <iostream>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "Animal()" << endl;
}
virtual void eating() = 0;
virtual ~Animal()
{
cout << "~Animal()" << endl;
}
};
class Dog:public Animal
{
public:
Dog()
{
cout << "Dog()" << endl;
}
void eating()
{
cout << "Dog is eating!" << endl;
}
~Dog()
{
cout << "~Dog()" <<endl;
}
};
int main()
{
Animal *ani = new Dog;
ani->eating();
delete ani;
return 0;
}
【C++札记】多态的更多相关文章
- final关键字、多态 (札记)
目录 protected fianl 子父类中同名的 private 方法 java中的前期绑定 免疫多态 谁先被执行,构造器 还是 初始化? 协变返回类型 <Thinking in java& ...
- java学习札记
java学习札记 0x0 学习原因 本来打算大三再去跟着课程去学习java的,但是现在题目越来越偏向java,所以迫于无奈开启了java的学习篇章,同时也正好写个笔记总结下自己学习一门语言的流程. ...
- Java中的多态
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...
- C# 工厂模式+虚方法(接口、抽象方法)实现多态
面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...
- C#非常重要基础之多态
前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...
- C++多态详解
多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...
- 【那些年关于java多态应用】
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...
- JAVA多态
多态是指当系统A访问系统B的服务时,系统B可以通过多种方式来提供服务,而这一切对系统A是透明的.比如动物园的饲养员能够给各种各样的动物喂食.下图显示了饲养员Feeder,食物Food和动物Animal ...
- C#多态“说来也说”——逻辑层BLL中的多态使用
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/5861842.html 昨天晚上,有个朋友说学了好久,依然没搞 ...
随机推荐
- Greenplum 与 PostgreSQL 修改元数据(catalog)的方法 allow_system_table_mods
背景 PostgreSQL大量的信息保存在元数据中,所有的元数据都是内部维护的,例如建表.建索引.删表等操作,自动维护元数据. 在某些迫不得已的情况下才可能需要直接对元数据进行修改. 默认情况下,用户 ...
- OKR的两个基本原则
<启示录>作者,前易贝高级副总裁,硅谷产品集团创始人马蒂·卡根在<OKR工作法>的序言中提到了目标管理法的两个原则: 不要告诉下属具体怎么做,要告诉他们你要什么,他们就会给你满 ...
- jsp解决大文件断点续传
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- ESP8266低功耗解决的其中一个问题(芯片发热,影响旁边的温湿度芯片)
这个项目的这个问题困扰了自己好长时间了,ESP8266芯片发热,导致了旁边的温湿度传感器采集不了空气中的温度....采集的温度是芯片发热的温度 一直采集出来的是30多度......尽管空气温度10几度 ...
- P2624 [HNOI2008]明明的烦恼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...
- JS实现Base64编码、解码,即window.atob,window.btoa功能
window.atob(),window.btoa()方法可以对字符串精选base64编码和解码,但是有些环境比如nuxt的服务端环境没法使用window,所以需要自己实现一个base64的编码解码功 ...
- Python各种扩展名(py, pyc, pyw, pyo, pyd)区别
扩展名 在写Python程序时我们常见的扩展名是py, pyc,其实还有其他几种扩展名.下面是几种扩展名的用法. py py就是最基本的源码扩展名 pyw pyw是另一种源码扩展名,跟py唯一的区别是 ...
- [xms]西软xms试算平衡报表-穿透明细报表-增加储值卡卡号列
只能呵呵哒 [xms]西软xms试算平衡报表-穿透明细报表-增加储值卡卡号列 pospay ' and hotelid='${hotelid}'; hhaccount ' and hotelid='$ ...
- 计蒜客——Nise-Anti-AK Problem
Nise-Anti-AK Problem #include<iostream> using namespace std; int b[1000]; int main() { ios::sy ...
- hhhhh我又双叒进步啦!
虽然说从今天开始短暂的暑假一周假期正式开始,然而第一天我就深感在家有多无聊...所以说还是整天待在学校好丫! 不过,就算在家, 勤奋好学的 我也要认真做题!今天就一鼓作气地把排名刷到了第 50 名!! ...